아웃조인과 NOT IN의 차이점이 궁금합니다. 0 3 1,177

by 봄빛 [Oracle 기초] [2018.10.25 13:14:10]


/**
AND A.ENTR_NO = C.ENTR_NO(+)
AND C.ENTR_NO IS NULL

--> 이부분이 이해가 안되서 질문드립니다.
이부분이 얼핏보기엔 NOT IN 하면 될거라 생각했는데 막상 조회해보니 결과가 다르게 나오네요

    아웃조인하고 나서 IS NULL 한 부분에 대해 설명해주실분 계신가요?

**/


SELECT Z.BILL_YYMM,Z.ENTR_NO,Z.FEE_PROD_NM,Z.BILL_ACNT_NO,Z.ACENO,Z.PROD_CD,Z.ENTP_VOIP_LINE_ENTR_NO

FROM TEST_1 Z,
     TEST_2 A,
     TEST_3 B,
     (SELECT ENTR_NO FROM TEST_4 WHERE DV_NM ='테스트제외070') C
WHERE Z.BILL_YYMM='201808'
AND Z.ENTR_NO = A.ENTR_NO (+)
AND Z.BILL_YYMM= A.BILL_YYMM(+)
AND A.BILL_YYMM = B.TRGT_YYMM(+)
AND A.PROD_CD = B.PROD_CD(+)
AND A.BLITEM_LCLS_CD = B.BLITEM_LCLS_CD(+)
AND A.BLITEM_MCLS_CD = B.BLITEM_MCLS_CD(+)
AND A.BLITEM_CD = B.BLITEM_CD(+)
AND B.FEE_TRGT_YN(+) = 'Y'
AND A.ENTR_NO = C.ENTR_NO(+)
AND C.ENTR_NO IS NULL
GROUP BY Z.BILL_YYMM,Z.ENTR_NO,Z.FEE_PROD_NM,Z.BILL_ACNT_NO,Z.ACENO,Z.PROD_CD,Z.ENTP_VOIP_LINE_ENTR_NO
;

 

by 마농 [2018.10.25 13:32:31]

z 에는 존재하지만 c 에는 존재하지 않는 자료 찾기입니다.
즉, z 에만 존재하고 c 에는 존재하지 않는 자료를 찾는 방법은
다음과 같은 방법들이 있습니다.
1. NOT IN
2. NOT EXISTS
3. OUTER JOIN & IS NULL
4. MINUS
그중 3번 방식을 쓰고 있는 거구요.

그런데 조인관계가 단순한게 아니라 z 와 c 사이에 a 가 끼어 있네요. z > a > c
NOT IN 방식으로 바꾸기가 조금 까다로울 수 있습니다.
굳이 바꿔야 할 이유가 있는지도 의문이네요?

그리고 이상한 조건이 하나 보이는데?
AND Z.ENTR_NO = A.BILL_YYMM(+)
이 조건 맞는 조건인가요? 컬럼명이 서로 다른데?

이상한 부분이 또 있네요.
1. z > a > c 로 연결이 되는데 b 는 왜 있는건가요?
  - 없어도 될 것 같은데요.
2. Group By 를 하는 이유는 뭔가요?
  - 원치않는 중복이 발생되나요?
  - 각 테이블간의 관계가 어떻게 되나요? 1:1, 1:다, 다:1 ?


by 봄빛 [2018.10.25 15:05:22]
1) AND Z.ENTR_NO = A.BILL_YYMM(+) ==> 옮겨적으면서 오타가 있었네요
  본문에 다시 수정했습니다.
2) z > a > c 로 연결이 되는데 b 는 왜 있는건가요?
제가원하는 부분만 발췌하면서 간소화 한부분이 있습니다.

select  절에 sum 하는 부분이 있어서 GROUP BY가 필요하고요 B 테이블의 컬럼도 사용됩니다.

3) 각 테이블간의 관계가 어떻게 되나요? 1:1, 1:다, 다:1 ?

z:a = 1:1
a:b = 1:다
c : 제외대상건


감사합니다 마농님 답변으로 어느정도 궁금한 점이 해결되었습니다.

그리고 NOT IN으로 변경하려는건 아니고 어떤 차이가 있는지가 궁금했습니다. 답변 감사합니다.

 


by 아발란체 [2018.10.25 14:10:12]

결과적으로 다르게 쓰셔서 다르게 나올 수 밖에 없는!! ^^

NOT IN 쿼리도 올려주시면 왜 서로 다르게 나오는지 비교가 될 것 같습니다.

 

아웃조인하고 IS NULL 관련

해당 구문으로 봤을 때 LEFT OUTER JOIN인데 

조인 후 우측 데이타가 없어도

좌측 기준으로는 결과를 보전하도록 출력하는 방식입니다.

IS NULL은 빈 값 ''이 아닌 NULL인 것만 추가 필터링 하는 부분이고요.

 

홧팅~ 

 

 

 

 

 

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