【发布时间】:2019-09-22 21:17:51
【问题描述】:
我正在重构一些使用 *= 运算符而不是首选的 ANSI LEFT JOIN 语法的旧 SQL Server 存储过程。我正在处理的一个过程给我带来了麻烦,因为它试图在同一个 FROM 子句中从 2 个不同的表中加入同一个表,并且它返回的结果与返回的原始旧过程不同。
我已经重构了大约 20 个其他存储过程,但它们都没有像这样在同一张表上进行多个左连接。旧的 *= 运算符似乎简化了这一操作。如您所见,在同一个 where 子句中加入 table3 非常简单。
旧代码
选择 ...
TABLE3.column10
来自表 1、表 2、表 3
在哪里 TABLE1.column5 *= TABLE3.column5
和 TABLE2.column8 *= TABLE3.column8
新代码
选择
TABLE3.colum10
来自
表1
左连接表 3 T3a
ON TABLE1.column5 = T3a.column5,
表 2
左连接表 3 T3b
ON TABLE2.column8 = T3b.column8
现在,由于我必须在新的 from 子句中为 TABLE3 设置别名,因此我在选择 column10 时没有得到预期的结果。
我希望通过查看新旧查询,您可以了解我的目标。如有必要,我可以提供更多详细信息,但我会尽量让我的问题尽可能简单。
【问题讨论】:
-
通过别名参考您的
SELECT中的表格。此外,您真的应该一直使用 ANSI-92 JOIN 语法;不仅仅是当您不能再使用 ANSI-89 LEFT JOIN 语法时。旧语法在 27 年前被替换是有充分理由的。 :) 我假设您在第二个查询中不是在CROSS JOIN到TABLE2之后?这就是你目前拥有的。如果您打算改用CROSS JOIN,如果不是,请使用正确的INNER JOIN。 -
回答您的问题的一个困难是,关于 3+ 表旧式连接如何保证工作或被视为工作,或给出与文档相反的错误答案的文档或示例很少,或被 SQL Server 迁移工具正确或错误地翻译。因此,如果您提供一些示例实际输出并描述您在此处“期望”的翻译,将会有很大帮助。无论如何:请在代码问题中给出minimal reproducible example--cut & paste & runnable code;具有期望和实际输出的示例输入(包括逐字错误消息);明确的规范和解释。
标签: sql sql-server left-join