2017-03-06 114 views
1

我有一个表像这样:更新表记录,而忽略重复

id | name | xyID 
---------------- 
1 | xxx | 100 
2 | yyy | 200 
3 | zzz | 300 
4 | zzz | 200 

我需要更新在xyID 200的所有项目现在处于xyID = 300,但我有名字和xyID一个键,在这种情况下,yyy会变成300,但我需要排除zzz,因为它会是重复的。有没有办法我可以忽略重复?我想我可以用一个脚本来做到这一点,并选择前一组中的所有项目,然后只更新它们,如果它们不存在,但希望只是在一个很好的查询中。

回答

2

这将update“YYY”而不是“ZZZ”通过使用not exists()作为where子句的一部分,以确保具有相同name一排已经为xyId = 300记录不存在。

update t 
    set xyId = 300 
where xyId = 200 
    and not exists (
    select 1 
    from t as i 
    where i.name = t.name 
     and i.xyId = 300 
    ); 

如果你想delete行与xyId = 200有与xyId = 300相应的记录,你可以使用exists()像这样:

delete 
from t 
where xyId = 200 
    and exists (
    select 1 
    from t as i 
    where i.name = t.name 
     and i.xyId = 300 
    ); 

rextester演示:http://rextester.com/IIQL1351

结果从更新:

+----+------+------+ 
| id | name | xyId | 
+----+------+------+ 
| 1 | xxx | 100 | 
| 2 | yyy | 300 | 
| 3 | zzz | 300 | 
| 4 | zzz | 200 | 
+----+------+------+ 

结果从删除:

+----+------+------+ 
| id | name | xyId | 
+----+------+------+ 
| 1 | xxx | 100 | 
| 2 | yyy | 300 | 
| 3 | zzz | 300 | 
+----+------+------+ 
+0

嗯即时得到零行更新..好像你的逻辑是正确的,但。 – user1336827

+0

@ user1336827我的查询中有一个错字,很抱歉 – SqlZim