조인 후 조건절 on 절과 where절의 차이가 궁금해요. 0 6 744

by 김쿠쿠 [SQL Query] [2018.07.30 11:13:13]


select * from TABLE_A A left outer join TABLE_B B
on 
A.id = B.A_id
and 
A.status = 1
;

select * from TABLE_A A left outer join TABLE_B B
on 
A.id = B.A_id
where 
A.status = 1
;

on절에 조건을 넣는것과 where절에 조건을 넣는것에 차이가 궁금해요.

저는 항상 where절에 조건을 넣었는데..

결과값이 다르더라구요.

by 우리집아찌 [2018.07.30 11:35:47]

나중에 where 넣으면 status = 1 빼고는 다 필터링 됩니다. 


by 김쿠쿠 [2018.07.30 13:37:06]

왜 on 절에 넣으면 필터링이 안되나요 ?? 그것이 궁금하네여 ㅎ


by 우리집아찌 [2018.07.30 13:50:41]

실행계획 보시면 알지만 위의 쿼리는 두개의 아우터조인되어서 풀리고 끝납니다.

" status = 1 " 은

STATUS = 1(+) 이런식으로 풀리게 됩니다.

반면에 아래 쿼리는 

a , b 테이블이 아우터조인 걸린 다음에 where status = 1 이 됩니다.

select * 
  from ( select * from a left outer join b on a.id = b.id )
 where status = 1 

이렇게 되지요.


by 우리집아찌 [2018.07.30 14:02:21]

두번째 쿼리를 살짝 돌려봤는데 아래와 더 유사하네요.

옵티마이져 똘똘하네요. ㅎㅎ

SELECT * 
  FROM (SELECT * FROM A WHERE A.STATUS = 1 ) A
       LEFT OUTER JOIN
       B 
    ON A.ID = B.ID
;  

 


by 김쿠쿠 [2018.07.30 14:14:48]

이해가 빡 되었습니다. 설명해 주셔서 감사합니다. ^^


by 마농 [2018.08.06 14:13:06]

결론부터 말하자면
  - ON 절은 조인 조건
  - WHERE 절은 검색 조건
이너조인의 경우 조건이 ON 에 오든 WHERE 에 오는 동일하게 동작합니다.
하자만 아우터 조인의 경우 조건절의 위치에 따라 결과가 달라집니다.
따라서 이너조인 아우터조인 따지지 말고 위 규칙을 따르는 것을 권장합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입