left join 질문 0 4 1,011

by 비너스 [Oracle 기초] [2016.07.07 11:45:47]


안녕하세요. 회원님들. 쿼리 질문을 드립니다.

기초가 부족하다보니 이런것도 모르네요. 늦었지만 알고 가려합니다.

아래 두개 쿼리는 같은것인데 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
   

by 마농 [2016.07.07 13:07:39]

이 조건 (C.ORDER_STATUS <> '납품') 의 위치가 문제죠.
조인 조건은 ON 절에 위치하고 검색조건은 WHERE 절에 와야 합니다.
이 조건은 검색조건이라기 보다는 조인조건이라고 보는게 맞습니다.
ON 절로 옮겨 주세요.


마찬가지로 (M.SAFE_VOL > B.CURR_STOCK) 이 족건도 조인조건이죠.
이 경우는 아우터 조인이 아니라 이너조인이므로
결과에 영향은 없습니다만...
그래도 원칙을 지켜서 작성하시는 게 좋습니다.


조인 조건은 ON 절에..
검색조건은 WHERE 절에...


그리고 Select List 를 보면 m 의 항목만 조회하네요?
이럴거면 아우터 조인을 할 이유가 없습니다.
(C.ORDER_STATUS <> '납품') 이 조건이 검색조건이라면?
아우터 조인이 아닌 이너조인이 되는게 맞죠.


by 비너스 [2016.07.07 15:18:24]

잘못알고 있던 지식으로 이제껏 일해온 것을 반성했습니다. 알려주셔서 감사합니다.
저는 on 절에는 PK 들만 적어야 하고 나머지는 where 에 가야하는줄 알았네요.
염치없지만 한가지만 더 질문드리면
" (C.ORDER_STATUS <> '납품') 이 조건이 검색조건이라면?
 아우터 조인이 아닌 이너조인이 되는게 맞죠. "
요부분에서,  검색조건으로 사용하는 경우에는 무조건 inner join 으로 해야하나요?
 


by 마농 [2016.07.07 15:40:24]

무조건 그런건가요? 식은 안됩니다.
왜 그런지?를 이해해야 합니다.


by 비너스 [2016.07.07 15:43:04]

아. 네 잘알겠습니다. 다시 찾아보고 이해해도록 하겠습니다.

감사합니다. 행복한 하루되세요

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