【问题标题】:Why does a condition in ON clause and WHERE clause make the results different?为什么 ON 子句和 WHERE 子句中的条件会使结果不同?
【发布时间】:2018-11-10 17:08:25
【问题描述】:

这些语句有不同的结果,第一个语句显示 2 个结果,包括空答案,而第二个语句显示 1 个结果,其中没有空答案。但为什么?使用 ON(语句... AND 语句...)与仅使用 AND 有何不同,与 ON 条件分开?我已经阅读了很多关于这个主题的内容,但不明白我读到了什么。如果有人能简单地解释一下,我将不胜感激。

SELECT E.EMPLOYEE_NO, S.SECTION_NO, S.START_DATE_TIME, S.LOCATION
FROM EMPLOYEE E LEFT OUTER JOIN SECTION S 
ON (S.COURSE_NO = E.EMPLOYEE_NO
AND OFFICE = 'RM30')
WHERE E.RECORD = 14;

SELECT E.EMPLOYEE_NO, S.SECTION_NO, S.START_DATE_TIME, 
S.OFFICE
FROM EMPLOYEE E LEFT OUTER JOIN SECTION S 
ON S.COURSE_NO = E.EMPLOYEE_NO
WHERE E.RECORD = 14
AND OFFICE = 'RM30';

【问题讨论】:

  • 如果您提出此类问题,则应确保两个查询中的列相等。在你使用LOCATION的另一个中你使用OFFICE
  • 这只是外连接的区别。从逻辑上讲,首先完成连接,然后应用 Where 条件。在第一个 Select OFFICE = 'RM30' 在连接期间评估(即它是连接的一部分),具有不同值的行不匹配,但由于外连接仍然返回。在第二个选择 Where 与 Outer Join 创建的 NULL 不匹配,实际上它与 Inner Join 的结果相同。
  • 嗨。这是一个常见问题解答。请始终在谷歌上搜索您的问题/问题/目标的许多清晰、简洁和特定的版本/措辞,带和不带您的特定字符串/名称,并阅读许多答案。将您发现的相关关键字添加到搜索中。如果您没有找到答案,请发布,使用 1 个变体搜索作为标签的标题和关键字。请参阅向下投票箭头鼠标悬停文本。如果您确实有要发布的非重复代码问题,请阅读并在minimal reproducible example 上采取行动。

标签: sql join left-join outer-join


【解决方案1】:

你指的是条件:

AND s.LOCATION = 'RM30'

(请限定列名!)

LEFT JOIN 在没有与第二个表匹配的情况下保留第一个表中的所有行(以及所有匹配的对)。当不匹配时,第二个表中的值为NULL

当条件在WHERE子句中时:

WHERE s.LOCATION = 'RM30'

那么对于不匹配的行,s.LOCATIONNULL。因此,条件失败(WHERE 过滤掉了NULL 和“假”条件)。换句话说,LEFT JOIN 变成了INNER JOIN

当然,当这个条件在ON子句中时,不会发生这种过滤,因为LEFT JOIN的定义。

【讨论】:

    【解决方案2】:

    Left outer join 可以提供与匹配记录无关的结果,但where condition 过滤掉结果(即它只会为匹配记录提供结果)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-07
      • 2012-06-28
      • 2017-11-10
      • 2018-07-21
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多