如果不存在则删除

时间:2015-01-04 13:42:20

标签: mysql sql

我有两张桌子:

第一张表: f (a,b,c,d是列)

a  |  b  |  c  |   d
1  |  2  |  3  |   4
5  |  6  |  7  |   8
9  |  10 |  11 |   12
13 |  14 |  15 |   16

第二个表: s (a,b,c,d是列)

a  |  b  |  c  |   d
5  |  6  |  c  |   d
9  |  10 |  c  |   d
20 |  5  |  c  |   d

我需要从 f 表中删除不等于行( f s 之间)

所以新的 f 表格如下:

a  |  b  |  c  |   d
5  |  6  |  7  |   8
9  |  10 |  11 |   12

如何知道两行相等? (我需要删除不等于的内容)

如果f.a=s.a AND f.b=s.b行相等,我需要保留此行。

我怎样才能用Sql构建它?所有我试图做的,不适合我。


这是我尝试做的源代码示例:

DELETE FROM f WHERE NOT EXISTS (
     SELECT * FROM f inner join s on (f.a=s.a and f.b=s.b) 
)

3 个答案:

答案 0 :(得分:2)

您可以使用DELETE / LEFT JOIN,在MySQL中看起来像;

DELETE f 
FROM f
LEFT JOIN s 
  ON f.a = s.a AND f.b = s.b
WHERE s.a IS NULL

如果f和s之间没有匹配的行,则s.a在结果中将为NULL,因此将删除f中的相应行。

An SQLfiddle to test with.

而且,与往常一样,在从互联网上的随机用户运行可能具有破坏性的SQL之前,请始终备份数据。

答案 1 :(得分:1)

如果没有子查询的连接,您可以执行您想要的操作:

DELETE FROM f
    WHERE NOT EXISTS (SELECT 1 FROM s on f.a = s.a and f.b = s.b) ;

答案 2 :(得分:0)

您可以使用MERGE功能,速度更快。

您的脚本将如下所示:

MERGE f as target
USING s as source 
ON (f.a=s.a and f.b=s.b) 
WHEN NOT MATCHED BY target
THEN DELETE 
;