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

时间:2010-06-25 13:42:40

标签: sql mysql

这就是我想要完成的事情:

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

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

示例:

第一张表:

ID
1
2
3

第二张表:

ID
6
7
8

第三表

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

在这种情况下,我想要从第一个表或第二个表中没有匹配ID的第三个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的行。那些是我可以删除的两行,因为它们是孤儿。

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

3 个答案:

答案 0 :(得分:14)

也许这个:

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

答案 1 :(得分:8)

只需使用

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

答案 2 :(得分:4)

SELECT t.ID
FROM third t
WHERE t.OTHERID NOT IN (
    SELECT ID
    FROM first

    UNION

    SELECT ID
    FROM second
)