我有: 我有两个简单的表,具有多对多关系,因此有一个链接它们的表。
我想做的事 下表:我想找到乔治和乔去过的所有城镇,但没有其他人去过(真实的数据库表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 查询中解决这个问题?希望我只是在一天工作后感到疲倦......
这可能有效,但问题并不完全清楚:
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)
)