Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用此联接语法是否存在性能差异或其他原因?_Sql Server_Tsql_Join - Fatal编程技术网

Sql server 使用此联接语法是否存在性能差异或其他原因?

Sql server 使用此联接语法是否存在性能差异或其他原因?,sql-server,tsql,join,Sql Server,Tsql,Join,我在我们的“遗留”代码中遇到了几个存储过程,它们的联接如下所示: SELECT * FROM TableA INNER JOIN TableB INNER JOIN TableC ON TableC.TableBId = TableB.TableBId ON TableA.TableAId = TableB.TableAId SELECT * FROM TableA INNER JOIN TableB ON TableA.TableAId = T

我在我们的“遗留”代码中遇到了几个存储过程,它们的联接如下所示:

SELECT  *
FROM    TableA
    INNER JOIN TableB
        INNER JOIN TableC ON TableC.TableBId = TableB.TableBId
    ON TableA.TableAId = TableB.TableAId
SELECT  *
FROM    TableA
INNER JOIN TableB ON TableA.TableAId = TableB.TableAId
INNER JOIN TableC ON TableB.TableBId = TableC.TableBId
我将以不同的方式编写此查询,如下所示:

SELECT  *
FROM    TableA
    INNER JOIN TableB
        INNER JOIN TableC ON TableC.TableBId = TableB.TableBId
    ON TableA.TableAId = TableB.TableAId
SELECT  *
FROM    TableA
INNER JOIN TableB ON TableA.TableAId = TableB.TableAId
INNER JOIN TableC ON TableB.TableBId = TableC.TableBId

结果是一样的,但是我发现第二个例子更容易理解,尤其是在有多个连接的情况下。使用
ON
子句“deferred”编写
JOIN
语句有什么好处吗?如第一个示例中所示,直到指定了所有连接之后才执行?

否,谓词顺序与执行方式无关。您可以将ON谓词放在WHERE中,或者随机混合它们,最终得到相同的执行计划。虽然我在重写我不完全理解的代码时会轻描淡写,但在您自己的代码中,您绝对应该以可读的方式来编写。

以前是否从Microsoft Access移植了旧代码?如果我没记错的话,Access有一些扭曲的限制,它会在所有的
JOIN
子句之后将
上的所有
子句推到末尾。还有括号。已经有一段时间了,所以我不记得确切的语法了。@ShannonSeverance谢天谢地,我不确定它是否在Access中,但如果它在Access中,我也不会感到惊讶。我记得我当时很奇怪。访问…*抖动*。根据这个问题,您的信息不正确。你能解释一下为什么你认为你的信息是正确的吗?好的,我应该澄清一下:在一个内部连接中,所有的谓词都是和的,谓词顺序并不重要。在这个特定的例子中,我非常确定解析器甚至会给出一个功能相同的抽象语法树。如果谓词位于WHERE中,AST可能会有所不同,但至少在t-SQL中,执行计划不会。我不能指出来源,因为我不是在什么地方读到的;十多年来没有读过一本关于SQL的书。