3

我对使用ONvs.过滤连接的理解是否WHERE正确?


WHERE

...将过滤连接表的结果,这意味着 aLEFT JOINRIGHT JOIN不会显示预期表中的所有记录,因为即使WHERE过滤器可能位于另一个表中的字段上,它们也会被过滤掉。

ON

...可以用作正在连接的表的过滤器。我曾经认为ON仅用于在连接两个表时比较它们之间的字段,但它也可以作为WHERE正在连接的特定表的隔离。


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

4

1 回答 1

3

@Gratzy 提供的链接很有帮助

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

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

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

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

一般来说,我的建议是始终使用 ON 子句中的适当关键字段来连接基于记录如何相互关联的逻辑的记录。使用 WHERE 子句应用逐渐限制此结果集的过滤条件。

于 2012-05-09T13:49:45.720 回答