我对使用ON
与WHERE
的过滤联接的理解是否正确?
WHERE
...将过滤联接表的结果,这意味着LEFT JOIN
或RIGHT JOIN
将不会显示目标表中的所有记录,因为即使{{1}它们也会被过滤掉过滤器可能位于另一个表中的字段上。
WHERE
...可以用作正在连接的表的过滤器。我以前认为ON
仅用于比较两个表在加入时的字段,但对于要连接的特定表,它也可以像隔离的ON
一样。
当你只加入两个表时,这一切都不重要,但我已经意识到,当在3个以上的表中进行非常大的连接时,理解差异是至关重要的。
答案 0 :(得分:3)
ON子句和WHERE子句中的条件之间的区别当然是灰色的。
对于INNER JOINS,他们是等同的。对于OUTER JOINS,您的理解是正确的,即在评估ON条件后概念上应用WHERE子句。
但在许多情况下,差异更多的是意图而不是功能。 ON条件和WHERE子句之间通常存在语义差异。
例如,旧版本的SQL Server确实使用WHERE子句中的条件实现了ON语法,使用*=
或=*
语法来暗示LEFT或RIGHT联接(这导致奇怪的微妙在某些情况下,不同的结果形成LEFT和RIGHT JOIN等价物
通常,我的建议是始终使用ON子句中的相应键字段根据记录如何相互关联的逻辑来连接记录。使用WHERE子句应用逐步限制此结果集的过滤条件。