过滤JOIN:WHERE与ON

时间:2012-05-09 13:34:21

标签: sql sql-server-2008 join where

我对使用ONWHERE的过滤联接的理解是否正确?


WHERE

...将过滤联接表的结果,这意味着LEFT JOINRIGHT JOIN将不会显示目标表中的所有记录,因为即使{{1}它们也会被过滤掉过滤器可能位于另一个表中的字段上。

WHERE

...可以用作正在连接的表的过滤器。我以前认为ON仅用于比较两个表在加入时的字段,但对于要连接的特定表,它也可以像隔离的ON一样。


当你只加入两个表时,这一切都不重要,但我已经意识到,当在3个以上的表中进行非常大的连接时,理解差异是至关重要的。

1 个答案:

答案 0 :(得分:3)

link @Gratzy provided很有帮助

ON子句和WHERE子句中的条件之间的区别当然是灰色的。

对于INNER JOINS,他们是等同的。对于OUTER JOINS,您的理解是正确的,即在评估ON条件后概念上应用WHERE子句。

但在许多情况下,差异更多的是意图而不是功能。 ON条件和WHERE子句之间通常存在语义差异。

例如,旧版本的SQL Server确实使用WHERE子句中的条件实现了ON语法,使用*==*语法来暗示LEFT或RIGHT联接(这导致奇怪的微妙在某些情况下,不同的结果形成LEFT和RIGHT JOIN等价物

通常,我的建议是始终使用ON子句中的相应键字段根据记录如何相互关联的逻辑来连接记录。使用WHERE子句应用逐步限制此结果集的过滤条件。