从 table 中删除行而不在(另一个 table 中)

Delete rows from a table with not in ( another table )

我有两个表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 returns false 或 NULL 如果子查询中的 any 值为 NULL。这就是运算符的定义方式。 NOT EXISTS 有更多预期行为。因此,如果您在子查询中有任何 NULL 值,这将起作用(即删除行)但 NOT IN 版本不会。

我建议您在执行 DELETE:

之前使用 SELECT 尝试逻辑
SELECT A.*
FROM A 
WHERE NOT EXISTS (SELECT 1 FROM b WHERE b.foreign_key_of_A_in_B = A.id_A);

DELETE FROM table WHERE id NOT IN 的标准如下所示:

DELETE from Table_A 
WHERE  id -- ID of Table_A
       not in (select ID FROM Table_B)

这应该从 Table B 中找到不在 Table A 中的 ID,如您的问题所述

首先在 SELECT 语句中尝试这个,看看它是否 returns 正确的行:

SELECT * from Table_A
WHERE  id -- ID of Table_A
       not in (select ID FROM Table_B)

不要忘记交叉引用某些行以进行仔细检查。