by 열정가이 [SQL Query] ON WHERE OUTER JOIN [2018.12.31 19:36:32]
ON 절은 JOIN 조건이며, WHERE 절은 검색조건으로 알고 있으며, OUTER JOIN 에서는 ON 절과 WHERE 절에 따라 결과가 다를 수 있다고 알고있습니다.
이 점에 대해 정확하게 이해하기 위해 공부를 진행하던 중 이해가 안되는 부분이 있어 이렇게 글을 남깁니다.
구매 내역을 저장하는 BUY_HIS 라는 테이블과 제품 정보를 저장하는 PRODUCT_TABLE을 가지고 공부를 하고 있었습니다.
SELECT B.BUY_TIME, B.USER_CODE, B.COUNT, B.PRICE AS SUM_PRICE, P.PRODUCT_CODE, P.PRODUCT_NAME, P.PRICE FROM BUY_HIS B, PRODUCT_TABLE P WHERE B.PRODUCT_CODE(+) = P.PRODUCT_CODE AND P.PRICE <= 5000;
그리고 위의 쿼리를 실행 했을 때 실행계획을 보고 제가 판단한 결과는 다음과 같습니다.
JOIN이 이뤄지기 전에 먼저 PRODUCT_TABLE을 가져오는 WHERE 조건이 먼저 실행되어, PRICE가 5000미만의 값들만 가져오게 되는 것이고, 그 후에 JOIN 이 이뤄지기 때문에 결과도 5000미만의 값들이 OUTER JOIN되어 원하는 결과값을 가져올 수 있었습니다.
그리고 다음 쿼리를 실행하니 아예 5000 미만에 대한 JOIN 조건이 무시되는걸 볼 수 있었습니다.
SELECT B.BUY_TIME, B.USER_CODE, B.COUNT, B.PRICE AS SUM_PRICE, P.PRODUCT_CODE, P.PRODUCT_NAME, P.PRICE FROM BUY_HIS B RIGHT OUTER JOIN PRODUCT_TABLE P ON B.PRODUCT_CODE = P.PRODUCT_CODE AND P.PRICE <= 5000
실행계획을 보니 먼저 조인이 이뤄지고 그 후에 filter 작업에서
P.PRICE <= CASE WHEN (B.PRODUCT_CODE (+) IS NOT NULL) THEN 5000 ELSE 5000 END
라고 되어 있던데, 결국 P.PRICE <= 5000 아닌가요?
그렇다면 제가 생각했을 때는 ON은 JOIN 조건이기 때문에 서로 PRODUCT_CODE 값이 같으면서 P.PRICE <= 5000 인 로우에 대해서 조인이 발생한다고 이해하려고 하는데 결과 값은 PRICE 값이 5000 이상인 값도 나오는걸 볼 수 있었습니다...
그래서 제가 이해가 되지 않는 점은
1. 왜 ON 절에 P.PRICE <= 5000 은 무시가 되는 것일까?
2. 그리고 항상 JOIN 보다 WHERE 절이 먼저 이뤄지는 것인가?
입니다....
아직 사회 초년생이라 모르는게 너무나 많습니다... 자세하게 알려주신다면 정말 너무 감사하겠습니다...ㅠ