从 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)
不要忘记交叉引用某些行以进行仔细检查。
我有两个表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)
不要忘记交叉引用某些行以进行仔细检查。