这可能是一件简单的事情,但我无法绕过它。我试过IN,不是EXISTS,除了等等......但似乎仍然无法做到这一点。
我有两张桌子。
Table A
-----------
BK
NUM
Table B
------------
BK
NUM
如何编写查询以从表A中删除基于这两个字段不在表B中的所有记录。因此,如果表A有BK = 1且NUM = 2的记录,那么它应该在表B中查看。如果表B也有BK = 1且NUM = 2的记录则不执行任何操作,但如果没有,则删除该记录来自表A.这有意义吗?
非常感谢任何帮助。
答案 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
即可。 (我们可以写DELETE
或DELETE t
,其中任何一个都可以。
(这只是一种(几种)可能方法的例证。)