为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哈士奇WWW 2019-06-17 17:45:15
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还是他们是一样的?
查看完整描述

3 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

这两个查询是相同的,除了第二个查询是ANSI-92 SQL语法,第一个查询是不包含JOIN子句的旧SQL语法。它们应该产生完全相同的内部查询计划,尽管您可能希望检查。

您应该使用ansi-92语法有以下几个原因。

  • JOIN子句的使用将关系逻辑与筛选逻辑(WHERE)分离开来,因此更清晰、更容易理解。
  • 与这个特定的查询无关,但在一些情况下,旧的外部联接语法(使用+)是不明确的,因此查询结果依赖于实现-或者根本无法解析查询。这种情况不会发生在ANSI-92中。
  • 这是一个很好的实践,因为现在大多数开发人员和dba将使用ANSI-92,您应该遵循这个标准。当然,所有现代查询工具都将生成ANSI-92。
  • 正如@GBN所指出的,它确实可以避免偶然的交叉连接。

我本人抵制ANSI-92有一段时间了,因为旧语法在概念上有一点优势,因为可以更容易地将SQL设想为所有使用的表的大规模笛卡儿连接,然后是过滤操作-这是一种可以帮助理解SQL查询正在做什么的脑力技术。然而,几年前,我决定我需要与时俱进,经过一段相对较短的调整期后,我现在非常喜欢它-主要是因为上面给出的第一个原因。唯一应该偏离ANSI-92语法,或者说不使用该选项的地方是自然连接,这是隐含的危险。


查看完整回答
1 反对 回复 2019-06-17
?
POPMUISE

TA贡献1765条经验 获得超5个赞

第二个构造称为SQL社区中的“固定连接语法”。第一个构造AFAIK没有被广泛接受的名称,所以让我们称它为‘旧样式’内部连接语法。

通常的争论是这样的:

“传统”语法的优点:谓词在物理上分组在WHERE子句,使查询更容易阅读和理解,这使得查询更一般,尤其是n元关系更容易阅读和理解(ON不固定语法的子句可以展开谓词,因此您必须在可视距离上查找一个表或列的外观)。

“传统”语法的缺点:当省略其中一个“联接”谓词时没有解析错误,其结果是笛卡儿乘积(称为CROSS JOIN在不固定的语法中),这样的错误很难检测和调试。此外,“联接”谓词和“筛选”谓词在WHERE子句,这会使它们彼此混淆。


查看完整回答
反对 回复 2019-06-17
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

这两个查询相等-第一种是使用非ANSI连接语法,第二种是ANSI连接语法.我建议坚持使用ANSI连接语法。

是的,当您要加入的表可能不包含任何匹配记录时,您想要使用的是左外部联接(顺便说一下,它也是ANSI连接语法)。

参考资料:SQL Server中的条件连接


查看完整回答
反对 回复 2019-06-17
  • 3 回答
  • 1 关注
  • 1061 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信