sql - 如何将 UNION 语句转换为 JOIN 语句
问题描述
我有三张桌子。
Table: Location
ID | Name
-------+--------
1 | Paris
2 | London
3 | Sydney
Table: Loc_Map
PrimaryLoc | SecondaryLoc
-----------+-----------
1 | 3
Table: User
ID | PrimaryLocID
----+-------------
22 | 1
我想要这个输出,用于 userID:22。
LocationID | LocationName
1 | Paris
3 | Sydney
请注意,结果包含使用映射表映射的两个位置 ID 的数据。我已经使用 UNION 运算符实现了所需的输出,如下所示:
SELECT L.id, L.name
FROM
location L
INNER JOIN Loc_Map LM ON L.id = LM.PrimaryLoc
INNER JOIN User U ON U.PrimaryLocID = LM.loc_id
WHERE U.id = 22
UNION
SELECT L.id, L.name
FROM
location L INNER JOIN User U ON L.id = U.PrimaryLocID
WHERE U.id = 22
为了提高性能,我试图将此 SQL 查询转换为 JOIN 语句,但不能。一个singleprimaryloc
可以有多个secondaryloc
s。我尝试尽可能好地格式化这个问题,但如果看起来很奇怪,请原谅我在格式化方面的经验不足。我也努力想出一个合适的通用问题标题,但除了给定的问题之外,我想不出。如果你想到一些,请告诉我。
我正在使用 SQL Server 2000。
解决方案
为什么不只是:
SELECT L.id, L.name
FROM
location L
INNER JOIN Loc_Map LM ON L.id in (LM.PrimaryLoc, LM.SecondaryLoc)
INNER JOIN User U ON U.PrimaryLocID = LM.loc_id
WHERE U.id = 22
但是请注意,在任何一般意义上,工会都不会“胜过”联接。他们是两个不同的东西。