ANSI连接和非ANSI连接查询的执行情况会有所不同吗?

ANSI连接和非ANSI连接查询的执行情况会有所不同吗?

我的业务逻辑在大约7000行T-SQL存储过程中,其中大多数具有下一个联接语法:

SELECT A.A, B.B, C.CFROM aaa AS A, bbb AS B, ccc AS CWHERE
    A.B = B.IDAND B.C = C.IDAND C.ID = @param

如果我将这样的查询替换为:

SELECT A.A, B.B, C.CFROM aaa AS AJOIN bbb AS B   ON A.B = B.IDJOIN ccc AS C   ON B.C = C.ID   AND C.ID = @param

还是他们是一样的?


哈士奇WWW
浏览 1070回答 3
3回答

动漫人物

这两个查询是相同的,除了第二个查询是ANSI-92 SQL语法,第一个查询是不包含JOIN子句的旧SQL语法。它们应该产生完全相同的内部查询计划,尽管您可能希望检查。您应该使用ansi-92语法有以下几个原因。JOIN子句的使用将关系逻辑与筛选逻辑(WHERE)分离开来,因此更清晰、更容易理解。与这个特定的查询无关,但在一些情况下,旧的外部联接语法(使用+)是不明确的,因此查询结果依赖于实现-或者根本无法解析查询。这种情况不会发生在ANSI-92中。这是一个很好的实践,因为现在大多数开发人员和dba将使用ANSI-92,您应该遵循这个标准。当然,所有现代查询工具都将生成ANSI-92。正如@GBN所指出的,它确实可以避免偶然的交叉连接。我本人抵制ANSI-92有一段时间了,因为旧语法在概念上有一点优势,因为可以更容易地将SQL设想为所有使用的表的大规模笛卡儿连接,然后是过滤操作-这是一种可以帮助理解SQL查询正在做什么的脑力技术。然而,几年前,我决定我需要与时俱进,经过一段相对较短的调整期后,我现在非常喜欢它-主要是因为上面给出的第一个原因。唯一应该偏离ANSI-92语法,或者说不使用该选项的地方是自然连接,这是隐含的危险。

POPMUISE

第二个构造称为SQL社区中的“固定连接语法”。第一个构造AFAIK没有被广泛接受的名称,所以让我们称它为‘旧样式’内部连接语法。通常的争论是这样的:“传统”语法的优点:谓词在物理上分组在WHERE子句,使查询更容易阅读和理解,这使得查询更一般,尤其是n元关系更容易阅读和理解(ON不固定语法的子句可以展开谓词,因此您必须在可视距离上查找一个表或列的外观)。“传统”语法的缺点:当省略其中一个“联接”谓词时没有解析错误,其结果是笛卡儿乘积(称为CROSS JOIN在不固定的语法中),这样的错误很难检测和调试。此外,“联接”谓词和“筛选”谓词在WHERE子句,这会使它们彼此混淆。

翻翻过去那场雪

这两个查询是相等-第一种是使用非ANSI连接语法,第二种是ANSI连接语法.我建议坚持使用ANSI连接语法。是的,当您要加入的表可能不包含任何匹配记录时,您想要使用的是左外部联接(顺便说一下,它也是ANSI连接语法)。参考资料:SQL Server中的条件连接
打开App,查看更多内容
随时随地看视频慕课网APP