更新表记录忽略重复

时间:2017-03-06 16:26:41

标签: sql-server

我有一张这样的表:

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

我需要更新xyID 200中的所有项目,现在是xyID = 300,但我有一个名称和xyID的键,所以在这种情况下,yyy将变为300,但我需要排除zzz,因为它将是重复的。有没有办法可以忽略重复?我想我可以使用脚本执行此操作,并选择上一组中的所有项目,然后仅在它们不存在的情况下更新它们,但希望只在一个不错的查询中进行更新。

1 个答案:

答案 0 :(得分:3)

这将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 );

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

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

更新的结果:

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

删除结果:

def move(n, m):
   if m < 2 or n < 2:
     return n * m
   elif m > 4 and n > 4
     return (4*(n+m)) - 16 + move(n-4,m-4)
   elif (n % 2 == 1):
     return 2 * n + move(m-2, n)
   else:
     return 2 * n