안녕하세요. 회원님들. 쿼리 질문을 드립니다.
기초가 부족하다보니 이런것도 모르네요. 늦었지만 알고 가려합니다.
아래 두개 쿼리는 같은것인데 left join 을 이제껏 잘못 알고 있던 모양입니다.
첫번째 쿼리는 행이 않나오고 두번째는 행이 나옵니다. 차이는 T_purchase_oreder 테이블을
left join 하는데 select 한 집합을 조인한것과 직접한 것입니다.
왜그런 것인지 궁금합니다. 부탁드립니다.
** 첫번째
SELECT
TO_CHAR(SYSTIMESTAMP,'YYYYMMDDHH24MISSFF3'), M.HP_NO, M.FARM_NM
FROM T_FARM_INFO M INNER JOIN (SELECT FARM_NO, SUM(CURR_STOCK) AS CURR_STOCK
FROM T_FARM_STOCK GROUP BY FARM_NO ) B ON M.FARM_NO = B.FARM_NO
LEFT JOIN T_PURCHASE_ORDER C ON M.FARM_NO = C.FARM_NO
WHERE M.SAFE_VOL > B.CURR_STOCK
AND M.USE_YN = 'Y'
AND C.ORDER_STATUS <> '납품'
ORDER BY M.FARM_NO
** 두번째
SELECT
TO_CHAR(SYSTIMESTAMP,'YYYYMMDDHH24MISSFF3'), M.HP_NO, M.FARM_NM
FROM T_FARM_INFO M INNER JOIN (SELECT FARM_NO, SUM(CURR_STOCK) AS CURR_STOCK
FROM T_FARM_STOCK GROUP BY FARM_NO ) B ON M.FARM_NO = B.FARM_NO
LEFT JOIN (SELECT * FROM T_PURCHASE_ORDER
WHERE ORDER_STATUS <> '납품'
) C ON M.FARM_NO = C.FARM_NO
WHERE M.SAFE_VOL > B.CURR_STOCK
AND M.USE_YN = 'Y'
ORDER BY M.FARM_NO
이 조건 (C.ORDER_STATUS <> '납품') 의 위치가 문제죠.
조인 조건은 ON 절에 위치하고 검색조건은 WHERE 절에 와야 합니다.
이 조건은 검색조건이라기 보다는 조인조건이라고 보는게 맞습니다.
ON 절로 옮겨 주세요.
마찬가지로 (M.SAFE_VOL > B.CURR_STOCK) 이 족건도 조인조건이죠.
이 경우는 아우터 조인이 아니라 이너조인이므로
결과에 영향은 없습니다만...
그래도 원칙을 지켜서 작성하시는 게 좋습니다.
조인 조건은 ON 절에..
검색조건은 WHERE 절에...
그리고 Select List 를 보면 m 의 항목만 조회하네요?
이럴거면 아우터 조인을 할 이유가 없습니다.
(C.ORDER_STATUS <> '납품') 이 조건이 검색조건이라면?
아우터 조인이 아닌 이너조인이 되는게 맞죠.