最好在你的ON子句中加入更多的逻辑,还是只有最小的必要条件?

jco*_*lum 7 sql sql-server

鉴于这两个问题:

Select t1.id, t2.companyName 
from table1 t1 
  INNER JOIN table2 t2 on t2.id = t1.fkId 
WHERE t2.aField <> 'C' 
Run Code Online (Sandbox Code Playgroud)

要么:

Select t1.id, t2.companyName 
from table1 t1 
  INNER JOIN table2 t2 on t2.id = t1.fkId  and t2.aField <> 'C'
Run Code Online (Sandbox Code Playgroud)

这两者之间有明显的区别吗?在我看来,条款"t2.aField <>'C'"将在t2中符合连接条件的每一行上运行,无论如何.我不对吗?

更新:我在SQL Server中执行了"包含实际执行计划".这两个查询完全相同.

Bra*_*vax 4

我更喜欢使用连接标准来解释表如何连接在一起。所以我会将附加子句放在 where 部分中。

我希望(尽管我没有统计数据)SQL Server 能够足够聪明地找到最佳查询计划,无论您使用什么语法。

但是,如果您的索引也包含 id 和 aField,我建议将它们放在内部联接标准中。

查看这 2(或 3)个场景中的查询计划并看看会发生什么会很有趣。好问题。