sql-server - SQL Server 引擎如何在此联接方案中工作?
问题描述
我正在使用 SQL Server 2019,在优化时我发现加入条件的放置方式不同,如下所示,
SELECT *
FROM #table1 a
INNER JOIN dbo.table2 b
INNER JOIN dbo.table3 c ON c.id = b.id
ON b.id=a.id
SQL Server 引擎实际上是如何工作的?将此连接更改为如下所示后,sql server 返回类似的返回,
SELECT *
FROM #table1 a
INNER JOIN dbo.table2 b ON b.id=a.id
INNER JOIN dbo.table3 c ON c.id = b.id
您能否帮助我了解这两个查询是否以相同的方式工作?如果不是,那么第一个查询与第二个查询有何不同?
解决方案
在这种情况下,从逻辑上讲,查询是等效的。
首先,(逻辑上)计算b
和c
使用之间的连接。ON c.id = b.id
请注意,这a
不在本ON
条款的范围内。让我们称之为结果bc
。
然后,使用1计算a
和之间的连接。请注意,第二个子句也可以引用.bc
ON b.id=a.id
ON
c
子句的位置ON
改变了计算 s 的顺序,这对JOIN
s 没有影响INNER JOIN
。
第二个查询更易于阅读,因为每个查询都以JOIN
它们的计算顺序出现。
如果第一个联接是 a LEFT JOIN
,那么由于联接顺序不同,您可能会开始看到两个查询之间的差异。
1我这里经常使用括号的类比——要找到JOIN
计算的顺序,你需要找到它们对应的ON
子句。如果您将每个JOIN
as(
和 each ON
as 视为)
,则匹配的括号指示哪些JOIN
和ON
子句匹配。
推荐阅读
- node.js - Mongdb 使用 Node.js Api 在另一个集合中插入数据
- c++ - 创建一个小排序(C++ 类介绍)
- node.js - 运行 npm install 时出错:.node-gyp/6.14.4/include/node/v8.h:21:10:致命错误:找不到“实用程序”文件
- html - 在程序运行 html 上添加到 div 的高度
- android - 如何检测完成动画 Lottie 并显示 Toast
- libreoffice-calc - LibreOffice Calc 时间格式
- xcode - 为什么视图控制器不跟随窗口控制器在“模态”中的外观?
- reactjs - 在 componentDidMount 之前和之后获取两个输出
- javascript - JavaScript中for循环的内部和外部
- python - PyHive - 长时间运行的查询超时 - [Errno 110] 连接超时