SQL:查找 ID 为 x、y、z 的每一行,其中值不存在于其他行中

问题描述 投票:0回答:1

我有: 我有两个简单的表,具有多对多关系,因此有一个链接它们的表。

我想做的事 下表:我想找到乔治和乔去过的所有城镇,但没有其他人去过(真实的数据库表1和表2都有数千条条目)

TABLE_1               LINK_TABLE             TABLE_2
ID   NAME             ID1   ID2              ID  NAME
1    George           1     1                1   New York
2    Joe              1     2                2   Los Angeles
3    Patrick          1     3                3   London
                      2     1                4   Tokyo
                      2     4                5   Paris 
                      2     3                6   Beijing
                      3     1
                      3     5
                      3     6

如果我这样做:

SELECT DISTINCT ID2 FROM LINK_TABLE WHERE ID1 IN (1, 2)

我了解乔治和乔参与过的所有内容,也了解帕特里克参与过的内容。

如果我这样做:

SELECT DISTINCT ID2 FROM LINK_TABLE WHERE ID2 IN (SELECT DISTINCT ID2 FROM LINK_TABLE WHERE ID1 IN (1, 2)) AND ID1 NOT IN (1,2)

我得到了帕特里克去过的那些,乔治和乔也去过的。

或者我可以这样做:

SELECT DISTINCT ID2 FROM LINK_TABLE 
WHERE ID1 IN (1, 2) AND ID2 NOT IN (
    SELECT DISTINCT ID2 FROM LINK_TABLE WHERE ID2 IN (
       SELECT DISTINCT ID2 FROM LINK_TABLE WHERE ID1 IN (1, 2)
    ) AND ID1 NOT IN (1,2)) 

buuuuuuut,在这一点上,它开始看起来很奇怪,而且我也担心它很慢。

是否有更多...可读且希望更快的方法来在 SQL 查询中解决这个问题?希望我只是在一天工作后感到疲倦......

sql subquery
1个回答
0
投票

这可能有效,但问题并不完全清楚:

SELECT *
FROM LINK_TABLE lt1
WHERE ID1 IN (1,2)
   AND NOT EXISTS (
      SELECT 1 
      FROM LINK_TABLE lt2
      WHERE lt2.ID2 = lt1.ID2
        AND l2.ID1 NOT IN (1,2)
)
© www.soinside.com 2019 - 2024. All rights reserved.