2011-01-14 83 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