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

时间:2012-02-29 14:40:50

标签: 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

这适用于前2个条件。但是无法合并第三次加入。任何人都可以建议一种方法来帮助这个吗? 提前谢谢。

2 个答案:

答案 0 :(得分:3)

从你的问题我想你只想要来自t3的行与t2中与t1连接的行连接:

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

除非来自t2的行已经与col1上的t1连接,否则这将不包括来自t2和t3的连接col2的行。

答案 1 :(得分:3)

您可以有多种变体,所有变体都有不同的结果集。其他人中的哪一个是初衷,如果不是不可能让其他人知道:


变体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。