JOIN ON 절과 WHERE 절에 IS NULL 조건 사용 시의 차이점
참고:
- https://stackoverflow.com/questions/6630887/using-is-null-or-is-not-null-on-join-conditions-theory-question
- https://community.teradata.com/t5/General/Is-Null-conditions-in-ON-Join-Vs-Is-Null-in-Where/td-p/50758
1. JOIN ON 절에 IS NULL 체크 관련 쿼리문 예시
select *
from TB_PARENT P with(nolock)
left outer join TB_CHILD C with(nolock)
on P.pid = C.pid
and C.pid is null
결과: JOIN ON 조건문은 테이블들이 서로 JOIN되는 과정에서 적용된다. TB_CHILD 테이블의 pid 컬럼값이 NULL인 것은 없을 것이며 left outer join이 되고 나서야 NULL값이 생성되기 때문에, 위의 JOIN ON 조건은 항상 false가 되어 LEFT OUTER JOIN문은 왼쪽 테이블(TB_PARENT)의 모든 ROW를 반환할 때, 오른쪽 테이블(TB_CHILD) 관련 컬럼값을 NULL로 채워 반환한다. 따라서, 자식이 없는 부모 데이터를 찾을 수 없다.
2. WHERE 절에 IS NULL 체크 관련 쿼리문 예시
select *
from TB_PARENT P with(nolock)
left outer join TB_CHILD C with(nolock)
on P.pid = C.pid
where C.pid is null
결과: WHERE 조건문은 테이블들이 서로 JOIN된 후에 적용된다. 왼쪽 테이블(TB_PARENT)과 오른쪽 테이블(TB_CHILD)이 LEFT OUTER JOIN되고 나서 where 조건문이 적용되기 때문에 자식이 없는 부모 데이터를 찾을 수 있다.