mysql - 改进mysql查询

标签 mysql sql left-join sql-delete

我有一个问题。

DELETE FROM A  
WHERE i NOT IN 
( SELECT i FROM B WHERE j = 1  
  UNION select i from C 
  UNION select i from D 
);

基本上删除 A 中字段 i 未出现在表 B、C 或 D 中的所有行。如果只是:

DELETE FROM A  
WHERE i NOT IN 
( SELECT i FROM B 
);

然后这可以通过左连接轻松完成

DELETE A FROM A 
LEFT JOIN B 
ON A.i = B.i
WHERE B.id is NULL;

(假设每个表在schema中都有一个id字段)

我想我的问题是以上是否延伸到 具有以下解决方案的三表方案?

DELETE A FROM A 
LEFT JOIN B 
ON A.i = B.i AND B.j = 1
LEFT JOIN C
ON A.i = C.i 
LEFT JOIN D
ON A.i = D.i
WHERE B.id is NULL
AND   C.id is NULL
AND   D.id is NULL

最佳答案

像这样:

DELETE 
  FROM A
 WHERE NOT EXISTS (
                   SELECT * 
                     FROM B
                    WHERE B.i = A.i
                  )
       AND NOT EXISTS (
                       SELECT * 
                         FROM C
                        WHERE C.i = A.i
                      )
       AND NOT EXISTS (
                       SELECT * 
                         FROM D
                        WHERE D.i = A.i
                      );

关于mysql - 改进mysql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3342108/

相关文章:

MySQL 显示存在于一个表中但不存在于另一个表中的行

php - 数组返回同一行的 43 个实例 - CodeIgniter PHP MySQL

python - 从 python 脚本启动 MySQL

Mysql LEFT JOIN 和 SUM 并显示 0 而不是 NULL

zend-framework - joinLeft Zend Framework,不同表中相同的字段名

php - MySQL使用另一个表中的值过滤一个表中的数据

php - SQL查询MySQL到JSON

mysql - 在 SQL 中将一条或多条记录合并为一条记录

java - 在java中避免SQL注入(inject)

mysql - 如果左连接表不为空则为空结果集,否则为空