【问题标题】:Delete rows from a table with not in ( another table )从不在的表中删除行(另一个表)
【发布时间】:2016-03-31 11:25:44
【问题描述】:

我有两个表A和B,在B中有一个来自A的外键,我想做的是从A中删除它们在B中没有出现的所有行,我执行以下查询但它不起作用:

DELETE from A 
WHERE  id_A
       not in (select DISTINCT(foreign_key_of_A_in_B) from B)

有什么想法吗?

【问题讨论】:

  • 试试select * from A where id_A not in (select ...。你有任何行吗?
  • 向我们展示表定义。 (我想知道 fk 的定义。)
  • 请回答 Jarlh 的问题,以便我们为您提供帮助。
  • 非常感谢大家的帮助,Gordon 的解决方案对我有用。

标签: mysql sql foreign-keys sql-delete


【解决方案1】:

我的第一个建议是尝试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);
如果子查询中的 any 值为 NULL,则

NOT IN 返回 false 或 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);

【讨论】:

  • 非常感谢 Gordon 的解决方案和解释(以前不知道这种带有空值的行为不存在),它就像一个魅力!
【解决方案2】:

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

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

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

先在 SELECT 语句中试试这个,看看它是否返回正确的行:

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

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

【讨论】:

  • 这就是我所做的,但在这种情况下,使用不存在作为戈登的解释是最好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2011-04-26
  • 2011-03-23
相关资源
最近更新 更多