SQL 多外部连接(将 t-sql 连接转换为 ANSI 格式)

标签 sql tsql left-join

我有 3 个表 t1、t2、t3。我想要一个基于这些条件的结果集:t1 在 t2 上有外部连接(t1 的所有行),t1 在 t3 上有外部连接(t1 的所有行)和 t2 在 t3 上有外部连接(t2 的所有行)。如何在单个查询中使用这些外部 3 连接? 基本上我想将 t-sql 格式查询转换为 ANSI 格式。原来的查询是这样的

Select * from t1, t2, t3
where t1.col1 *= t2.col1
  and t1.col2 *= t3.col1
  and t2.col2 *= t3.col2

我设法将前 2 个连接用作

   Select * 
     from t1
left join t2 on t1.col1 = t2.col1
left join t3 on t1.col2 = t3.col1

这适用于前两种情况。但是无法合并第三个连接。任何人都可以建议一种方法来完成这个吗? 提前致谢。

最佳答案

您可以有多种变体,所有变体都具有不同的结果集。其他人很难甚至不可能分辨出其中哪一个是初衷:


(变体 1 - Tobsey 的查询,先连接到 t2,再连接到 t3,相当于:

SELECT 
    * 
FROM
        t1
    INNER JOIN                                --- or LEFT JOIN
        t2 
            ON  t1.col1 = t2.col1
    LEFT JOIN 
        t3 
            ON  t1.col2 = t3.col1 
            AND t2.col2 = t3.col2     --- this line makes the first LEFT join
                                      --- equal to INNER join

(变体 2 - 首先连接到 t3,然后连接到 t2):

SELECT 
    * 
FROM
        t1
    INNER JOIN                                --- or LEFT JOIN
        t3 
            ON  t1.col2 = t3.col1 
    LEFT JOIN 
        t2 
            ON  t1.col1 = t2.col1  
            AND t3.col2 = t2.col2 

(变体 3a - 首先将 t2 连接到 t3,然后将 t1 连接到该连接):

SELECT 
    * 
FROM
        t1
    LEFT JOIN
            t2 
        LEFT JOIN 
            t3 
                ON  t2.col2 = t3.col2  
        ON  t1.col1 = t2.col1
        AND t1.col2 = t3.col1 

如果您将第一个或第二个 LEFT 连接替换为 INNER 连接,则变体 3 可以有更多的子变体。

我猜你想要变体 3a。

关于SQL 多外部连接(将 t-sql 连接转换为 ANSI 格式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9501089/

相关文章:

java - 如何使用 JPA(Hibernate) 在连接表上查找实体?

c# - LINQ/Lambda 相当于 SQL NOT IN

tsql - T-SQL 仅在表不为空时才加入表

sql-server - SQL Server表使用情况统计

mysql - 使用 SQL 和日期进行操作

php - SQL 语法错误,简单 PHP 形式的连接问题

php - 检索名称为 的变量,其中包含另一个变量

sql-server - SQL Server中镜像的一对多关系

MYSQL 查询 LEFT JOIN 和 GROUP BY

mysql - 左连接更新的行为