SQL:根据两个字段从表A中删除表B中不存在的记录

时间:2014-07-18 23:27:53

标签: mysql sql

这可能是一件简单的事情,但我无法绕过它。我试过IN,不是EXISTS,除了等等......但似乎仍然无法做到这一点。

我有两张桌子。

Table A
-----------

BK
NUM

Table B
------------

BK
NUM

如何编写查询以从表A中删除基于这两个字段不在表B中的所有记录。因此,如果表A有BK = 1且NUM = 2的记录,那么它应该在表B中查看。如果表B也有BK = 1且NUM = 2的记录则不执行任何操作,但如果没有,则删除该记录来自表A.这有意义吗?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

你可以这样做

delete from tablea
where (BK,NUM) not in 
(select BK,NUM from tableb)

使用exists

delete from tablea a
where not exists
(select 1 from tableb where BK=a.BK and NUM = a.NUM)

答案 1 :(得分:1)

另一种方法是使用反连接模式,LEFT [OUTER] JOIN,然后在WHERE子句中使用谓词来过滤掉所有匹配项。

最简单的方法是首先将其作为SELECT编写,测试它,然后转换为DELETE。

SELECT t.*
  FROM tablea t
  LEFT
  JOIN tableb s
    ON s.BK  = t.BK
   AND s.NUM = t.NUM
 WHERE s.BK IS NULL

LEFT JOIN返回 t 中的所有行以及来自 s 的匹配行。 "技巧"是WHERE子句中的谓词...我们知道 s.BK 在所有匹配行上都是非NULL的(因为该值必须满足相等比较,在谓词中ON条款)。因此 s.BK 仅对 t {{1}中没有匹配行的行为NULL }

对于MySQL,将其更改为DELETE语句很简单,只需将s关键字替换为SELECT即可。 (我们可以写DELETEDELETE t,其中任何一个都可以。

(这只是一种(几种)可能方法的例证。)