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 会有什么不同吗?
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/