根据连接结果删除记录

时间:2016-01-26 08:35:40

标签: mysql join

我有两个由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行,因此我需要以大量方式执行

3 个答案:

答案 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)都是一样的。