JOIN 短路

mot*_*zzt 3 join sql-server t-sql

我一直在到处搜索,但我找不到任何关于它的东西,似乎每个人都只关心 WHERE 和 CASE。(而且我手头没有 SQL Server 来亲自验证它)

那么,一个简单的问题:SQL Server 是否基于 JOIN 条件短路 JOIN?如果我写:

TableA LEFT OUTER JOIN TableB ON 1=0 AND TableA.ID = TableB.A_ID
Run Code Online (Sandbox Code Playgroud)

SQL Server 会跳过连接吗?


编辑

好的,有人正确地指出这是在编译时解决的,所以我最好扩展一下这个问题。

以上只是作为一个例子,但结果证明这是一个糟糕的例子。我想知道的是,当这种情况在运行时发生时,SQL Server 是否会短路 JOIN,作为传递给存储过程的 @parameter 的结果。

我问是因为我肯定在过去几年中使用过类似的东西,但我想在与一些同事谈论它之前 100% 确定。那么,SQL Server 是否会将其短路,然后:

TableA LEFT OUTER JOIN TableB ON @parameter IS NOT NULL AND TableA.ID = TableB.A_ID
Run Code Online (Sandbox Code Playgroud)

如果它在 SP 内并且在 @parameter 设置为 NULL 的情况下调用它?如果存储过程是 WITH RECOMPILE 会有什么不同吗?

Len*_*art 6

DB<>fiddle和其他在线服务允许您测试不同的 DBMS,而无需在本地安装它们。如图所示:

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=7692d5abba854bdc57d90c95335014c0

无法访问表 B。

您可能会发现 Lukas Eder 对以下文章感兴趣,他比较了不同 DBMS 的代数优化:

https://blog.jooq.org/2017/09/28/10-cool-sql-optimisations-that-do-not-depend-on-the-cost-model/