首页 > 解决方案 > 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 
                            

您能否帮助我了解这两个查询是否以相同的方式工作?如果不是,那么第一个查询与第二个查询有何不同?

标签: sql-server

解决方案


在这种情况下,从逻辑上讲,查询是等效的。

首先,(逻辑上)计算bc使用之间的连接。ON c.id = b.id请注意,这a不在本ON条款的范围内。让我们称之为结果bc

然后,使用1计算a和之间的连接。请注意,第二个子句可以引用.bcON b.id=a.idONc

子句的位置ON改变了计算 s 的顺序,这对JOINs 没有影响INNER JOIN

第二个查询更易于阅读,因为每个查询都以JOIN它们的计算顺序出现。

如果第一个联接是 a LEFT JOIN,那么由于联接顺序不同,您可能会开始看到两个查询之间的差异。


1我这里经常使用括号的类比——要找到JOIN计算的顺序,你需要找到它们对应的ON子句。如果您将每个JOINas(和 each ONas 视为),则匹配的括号指示哪些JOINON子句匹配。


推荐阅读