首页 > 解决方案 > 如何将 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可以有多个secondarylocs。我尝试尽可能好地格式化这个问题,但如果看起来很奇怪,请原谅我在格式化方面的经验不足。我也努力想出一个合适的通用问题标题,但除了给定的问题之外,我想不出。如果你想到一些,请告诉我。

我正在使用 SQL Server 2000。

标签: sqlsql-server

解决方案


为什么不只是:

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

但是请注意,在任何一般意义上,工会都不会“胜过”联接。他们是两个不同的东西。


推荐阅读