【问题标题】:Filtering JOINs: WHERE vs. ON过滤 JOIN:WHERE 与 ON
【发布时间】:2012-05-18 00:50:55
【问题描述】:

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


WHERE

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

ON

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


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

【问题讨论】:

  • ON 用于加入条件,它只会过滤INNER JOIN 的结果
  • 您的问题真的是关于两者之间的区别吗?目前您似乎在问两个问题,WHERE 做什么, ON 做什么?
  • 检查这个问题它有一个很好的答案stackoverflow.com/questions/1401889/…

标签: sql sql-server-2008 join where


【解决方案1】:

link @Gratzy provided 很有帮助

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 2014-10-09
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多