sql - 如何将 UNION 语句转换为 JOIN 语句

标签 sql sql-server

我有三个表。

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

我正在使用 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

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

关于sql - 如何将 UNION 语句转换为 JOIN 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51313028/

相关文章:

mysql - 没有显示我需要的结果

sql - 无法在多个表之间进行所需的联接

sql-server - 用于对分组值进行计数的 SQL 列

sql-server - ServiceStack OrmLite 未检索 SqlGeography 字段

Mysql 查询在 WHERE 中使用 SELECT

MySQL - 先按字母顺序排列字段,然后按小数点排列

java - SQlite WHERE 语句不起作用?

sql - 查询以计算演出收入占所有演出总收入的比例

sql-server - 无法修改 SQL Server 维护计划

SQL - 如何制作排除条件