我有一张这样的表:
id | name | xyID
----------------
1 | xxx | 100
2 | yyy | 200
3 | zzz | 300
4 | zzz | 200
我需要更新xyID 200中的所有项目,现在是xyID = 300,但我有一个名称和xyID的键,所以在这种情况下,yyy将变为300,但我需要排除zzz,因为它将是重复的。有没有办法可以忽略重复?我想我可以使用脚本执行此操作,并选择上一组中的所有项目,然后仅在它们不存在的情况下更新它们,但希望只在一个不错的查询中进行更新。
答案 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