我有两个表A和B,B中有一个来自A的外键,我想要做的是从A中删除所有它们在B中都没有出现的行,我执行以下查询,但是它是不起作用:
DELETE from A
WHERE id_A
not in (select DISTINCT(foreign_key_of_A_in_B) from B)
任何想法 ?
最佳答案
我的第一个建议是尝试使用not exists
而不是not in
:
DELETE a FROM a
WHERE NOT EXISTS (SELECT 1 FROM b WHERE b.foreign_key_of_A_in_B = a.id_A);
如果子查询中的任何值为
NOT IN
,则NULL
返回false或NULL
。这就是定义运算符的方式。 NOT EXISTS
具有更多预期行为。因此,如果子查询中有任何NULL
值,则可以使用(即删除行),而NOT IN
版本则无效。我建议您在执行
SELECT
之前先尝试使用DELETE
进行逻辑运算:SELECT A.*
FROM A
WHERE NOT EXISTS (SELECT 1 FROM b WHERE b.foreign_key_of_A_in_B = A.id_A);