首页 > 解决方案 > 如何在同一个查询中从 2 个不同的表中多次左连接同一个表?

问题描述

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

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

旧代码

选择 ... TABLE3.column10

来自 TABLE1、TABLE2、
TABLE3 其中 TABLE1.column5 *= TABLE3.column5
和 TABLE2.column8 *= TABLE3.column8

新代码

从 TABLE1中选择
TABLE3.colum10 左连接 TABLE3 T3a ON TABLE1.column5 = T3a.column5,






TABLE2
LEFT JOIN TABLE3 T3b
ON TABLE2.column8 = T3b.column8

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

我希望通过查看新旧查询,您可以了解我的目标。如有必要,我可以提供更多详细信息,但我会尽量让我的问题尽可能简单。

标签: sqlsql-serverleft-join

解决方案


你为什么不这样做?

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;

或者至少这个逻辑对我来说更有意义,关于这三个表。但是,这里的连接是多余的。


推荐阅读