2011-01-14 85 views
1

我有一個int id列,我需要做一次性維護/修復更新。更新數據庫表中的列

For example, currently the values look like this: 
1 
2 
3 

I need to make the following change: 
1=3 
2=1 
3=2 

有沒有辦法在一個語句來做到這一點?我一直在想象,如果說,當涉及到3 = 2這將改變1 = 3更新3 = 2這給

Incorrectly: 
2 
1 
2 

如果發生這種情況,然後從1 = 3的變化更新會感到困惑有道理, 杆。

回答

1

怎麼樣一個sql case語句(像這樣)?

UPDATE table SET intID = CASE 
WHEN intID = 3 THEN 2 
WHEN intID = 1 THEN 3 
WHEN intID = 2 THEN 1 
END 
0

過去,我通過創建一個臨時表(其結構與目標表相同)和一個額外的列來保存新值來完成類似的工作。一旦我擁有了所有的新值,我就會將它們複製到目標表中的目標列,然後刪除臨時表。

2

UPDATE語句中的所有賦值(SET子句中的賦值以及單個行上的賦值)都被設爲好像它們全部同時發生一樣。

所以

UPDATE Table Set ID = ((ID + 1) % 3) + 1 

(或其他合適的邏輯是,因爲我不知道是什麼,從第二表所需的「方向」)將正確地行事。

你甚至可以用這些知識來交換兩列的值:

UPDATE Table SET a=b,b=a 

將交換列的內容,而不是(正如您所料)與設置爲相同的兩列結束值。

1

這是怎麼了,我通常做

DECLARE @Update Table (@oldvalue int, @newvalue int) 

INSERT INTO @Update Values (1,3) 
INSERT INTO @Update Values (2,1) 
INSERT INTO @Update Values (3,2) 

Update Table 
SET 
    yourField = NewValue 
FROM 
    table t 
    INNER JOIN @Update 
    on t.yourField = @update.oldvalue