/** 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 ;
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 ?
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으로 변경하려는건 아니고 어떤 차이가 있는지가 궁금했습니다. 답변 감사합니다.