我有两个由id连接的表。 表A是我定义记录的地方。 表B是我使用定义并添加一些数据的地方。 我正在做一些数据规范化,我已经意识到在表B上有一些ID不再在表A中定义。
如果我运行此查询:
SELECT B.id_cred, A.id_cre from B LEFT JOIN A ON B.id_cred=A.id_cre
我在A.id_cre上看到那些为NULL的记录。
我想从表B中删除那些查询在表A上返回null的记录吗?
类似的东西:
DELETE FROM B WHERE id IN (SELECT B.id from B LEFT JOIN A ON B.id_cred=A.id_cre WHERE a.id IS NULL)
但是此查询会引发错误,因为表B同时是目标和引用。
您无法在FROM子句
中为UPDATE指定目标表B.
请注意,连接查询将返回1408行,因此我需要以大量方式执行
答案 0 :(得分:2)
选项1,使用NOT EXISTS
:
delete from B
where not exists (select 1 from A where A.id_cre = B.id_cred)
选项2,DELETE
使用JOIN
:
delete B
from B
left join A on B.id_cred = A.id_cre
where A.id_cre is null
答案 1 :(得分:0)
这应该可以解决问题:
DELETE FROM B
WHERE NOT EXISTS (
SELECT id_cre
FROM A
WHERE B.id_cred=A.id_cre)
只需删除A中没有密钥的B中的任何行。
注意:“A”和“B”不能是别名,它们必须是实际的表名。
希望这有帮助!
答案 2 :(得分:-1)
为什么不使用A表中的id_cre
,因为它们都有id。
本声明:
DELETE FROM B WHERE id IN (SELECT B.id from B LEFT JOIN A ON B.id_cred=A.id_cre WHERE a.id IS NULL)
简单地说a和b (B.id_cred=A.id_cre)
都是一样的。