为什么ON子句和WHERE子句中的条件使结果不同?

时间:2018-11-10 17:08:25

标签: sql join left-join outer-join

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

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';

2 个答案:

答案 0 :(得分:0)

您所指的条件:

AND s.LOCATION = 'RM30'

(请限定列名!)

LEFT JOIN与第二张表不匹配时(以及所有匹配的对),所有行都保留在第一张表中。如果不匹配,则第二个表中的值为NULL

当条件在WHERE子句中时:

WHERE s.LOCATION = 'RM30'

然后,对于不匹配的行,s.LOCATIONNULL。因此,条件失败(WHERE同时过滤出NULL和“ false”条件)。换句话说,LEFT JOIN变成了INNER JOIN

当然,当此条件位于ON子句中时,由于LEFT JOIN的定义,因此不会进行此类过滤。

答案 1 :(得分:0)

Left outer join可以提供与匹配记录无关的结果,但是where condition可以过滤出结果(即,仅为匹配记录提供结果)