用于查找其他表中不存在的行的 SQL 查询

标签 sql mysql

这是我想要完成的:

我有两张 table ,第一张和第二张。他们每个人都有一个 ID 列。他们可能有其他专栏,但这些并不重要。我有第三张 table ,称之为第三张。它包含两列,ID 和 OTHERID。 OTHERID 引用表 first 和 second 中可能存在或不存在的条目。

我想查询第三个并查找没有在第一个或第二个表中找到的 OTHERID 列值的行。目标是从表 third 中删除这些行。

例子:

第一个表:

ID
1
2
3

第二个表:

ID
6
7
8

第三张 table

ID  | OTHERID
21        1
22        2
23        3
24        4
25        5
26        6
27        7
28        8

在这种情况下,我想从第一个表或第二个表中没有匹配 ID 的第三个检索 ID。我希望取回以下 ID:

24
25

我尝试过的:

我已经做了一些事情来取回不在第一位的第三位的条目:

select t.* from third t where not exists (select * from first f where t.otherid = f.id);

这将使我返回以下行:

ID  | OTHERID
24        4
25        5
26        6
27        7
28        8

同样,我可以得到那些不在第二位的:

select t.* from third t where not exists (select * from second s where t.otherid = s.id);

我会得到:

ID  | OTHERID
21        1
22        2
23        3
24        4
25        5

今天早上我想不通的是如何将两个查询组合在一起以获得两个结果集之间的交集,以便只返回 ID 为 24 和 25 的行。这些是我可以删除的两行,因为它们是孤儿。

你会如何解决这个问题?我认为我在正确的轨道上,但我只是在这一点上旋转,没有任何进展。

最佳答案

也许是这样的:

SELECT third.*
FROM third
LEFT JOIN first ON third.otherID = first.id
LEFT JOIN second ON third.otherID = second.id
WHERE first.id IS NULL AND second.id IS NULL

关于用于查找其他表中不存在的行的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3118469/

相关文章:

MySQL - 如何将 INSERT、INSERT IGNORE 和 ON DUPLICATE UPDATE 组合到一个工作查询中?

sql - 使用 sqlite 进行非常大的合并和基本查询

mysql - 无法卸载 mysql-server-8.0

php - 带有 php 变量的 MySQL 字符串连接

php - 计算按要求标记的项目以及另一个表中缺失或部分存在的项目

sql - 如何在不使用sql循环的情况下过滤日期之间的行

mysql - sql表的同一列如何添加两个字段?

mysql - 从重复记录中删除单个值

mysql - 如何获取被标记的文章?

带有随机 ID 变量的 PHP header