您如何在同一查询中从2个不同的表中多个左联接同一表?

时间:2019-05-04 16:58:43

标签: sql sql-server left-join

我正在重构一些旧的SQL Server存储过程,这些过程使用* =运算符而不是首选的ANSI LEFT JOIN语法。我正在处理的过程之一给我带来麻烦,因为它试图在同一FROM子句中将2个不同表中的同一表左联接,并且它没有返回与原始旧过程相同的结果。

我已经重构了大约20个其他存储的proc,但是它们都没有在同一张表上进行多个左联接。旧的* =运算符似乎简化了这一操作。如您所见,将table3都加入到同一where子句中非常简单。

旧代码

选择... TABLE3.column10

从TABLE1,TABLE2,TABLE3
TABLE1.column5 * = TABLE3.column5
  和TABLE2.column8 * = TABLE3.column8

新代码

SELECT
TABLE3.colum10

来自
表1
左联接表3 T3a
在TABLE1.column5 = T3a.column5,

TABLE2
左联接表3 T3b
在TABLE2.column8 = T3b.column8

现在,由于我必须在新的from子句中别名TABLE3,因此在选择column10时没有得到预期的结果。

我希望通过查看新旧查询,您可以大致了解我的目标。如有必要,我可以提供更多详细信息,但是我一开始试图使我的问题尽可能简单。

1 个答案:

答案 0 :(得分:1)

你为什么不这样做?

SELECT t3.colum10 
FROM TABLE1 t1 CROSS JOIN
     TABLE2 t2 LEFT JOIN
     TABLE3 T3
     ON t1.column5 = T3a.column5 AND
        t2.column8 = T3b.column8;

实际上,我对旧语法有些困惑,但是我认为您想要这样做:

SELECT t3.colum10 
FROM TABLE3 t3 LEFT JOIN
     TABLE1 t1
     ON t1.column5 = T3.column5 LEFT JOIN
     TABLE2 t2
     ON t2.column8 = T3.column8;

关于这三个表,至少对于我而言,至少这种逻辑更有意义。但是,这里的连接是多余的。