0

我有下表: -

Table Idsets

Id  UserGroup

1    A
1    B
1    C
2    A
2    D

我希望能够交换 Id 值

我努力了 :-

UPDATE Idsets
SET Id = CASE Id WHEN '1' THEN '2' ELSE '1'END;

这将失败并显示错误消息“无法在对象中插入重复的键行”..等。

我认为我需要做的是防止在 UserGroup 字段值相同的情况下交换 Id 字段值。

谁能帮我构造一个 WHERE 子句添加到 case 语句中,如果 UserGroup 字段不同,它只会交换 Id 字段值?非常感谢。

4

1 回答 1

1

我认为您需要分两步执行此操作:

UPDATE Idsets
    SET Id = CASE Id WHEN '1' THEN '-1' ELSE '-2'END;

update idsets
    set id = (case id when '-1' then '2' else '1' end);

似乎您有一个唯一索引或复合主键id, UserGroup。因此,当您将行更改(1, 'A')(2, 'A')(或反之亦然)时,您会收到重复错误。

编辑:

根据您关于排除某些更新的评论:

upate idsets
     SET Id = CASE Id WHEN '1' THEN '2' ELSE '1'END
    where not exists (select 1
                      from idsets i2
                      where ((i2.id = '1' and idsets.id = '2') and (i2.UserGroup = idsets.UserGroup)) or
                            ((i2.id = '2' and idsets.id = '1') and (i2.UserGroup = idsets.UserGroup))
                     ) 
于 2013-07-12T15:18:22.630 回答