我正在重构一些旧的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时没有得到预期的结果。
我希望通过查看新旧查询,您可以大致了解我的目标。如有必要,我可以提供更多详细信息,但是我一开始试图使我的问题尽可能简单。
答案 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;
关于这三个表,至少对于我而言,至少这种逻辑更有意义。但是,这里的连接是多余的。