【问题标题】:Is there a performance difference or another reason to use this JOIN syntax?使用此 JOIN 语法是否存在性能差异或其他原因?
【发布时间】:2016-09-07 07:35:13
【问题描述】:

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

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 子句“延迟”编写JOIN 语句有什么好处,直到所有连接都被指定后,如第一个示例所示?

【问题讨论】:

  • 过去的旧代码是否从 Microsoft Access 移植过来?如果我没记错的话,Access 有一些棘手的限制,会在所有 JOIN 子句之后将所有 ON 子句推到末尾。还有括号。已经有一段时间了,所以我不记得确切的语法了。
  • @ShannonSeverance 谢天谢地,我不确定它是否曾经在 Access 中,但如果是的话,我不会感到惊讶。我想我记得 Access 很奇怪。访问.....*颤抖*

标签: sql-server tsql join


【解决方案1】:

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

【讨论】:

  • stackoverflow.com/questions/354070/…。根据这个问题,您的信息不正确。你能解释一下为什么你认为你的信息是正确的吗?
  • 好的,我应该澄清一下:在 INNER JOIN 中,所有谓词都被 AND 在一起,谓词顺序无关紧要。在这种特定情况下,我很确定解析器甚至会输出功能相同的抽象语法树。如果谓词在 WHERE 中,AST 可能会有所不同,但执行计划不会,至少在 T-SQL 中是这样。我不能指出来源,因为这不像我只是在某个地方读到的;十多年来没有读过一本关于 SQL 的书。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多