如果不存在则删除

DELETE if NOT EXIST

我有两个 table:

首先table: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

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

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

我需要删除不等于行(在fs之间) f table 只有

所以新的 f table 看起来像这样:

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) 
)

你可以做你想做的事而无需在子查询上加入:

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

您可以使用 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 之前备份您的数据,因为互联网上的随机人员可能会破坏它。

您可以使用 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 
;