by 호호아줌마 [SQL Query] leftouterjoin 레프트아우터조인 이너테이블조건 [2021.03.18 09:02:38]
SELECT A.A_PK1 , A.A_PK2 -- , SUM(A.A_QTY) , SUM(B.B_QTY) , SUM(C.C_QTY) FROM TB_A A , TB_B B , TB_C C WHERE 1=1 AND A.A_PK1 = B.A_PK1 AND A.A_PK2 = B.A_PK2 AND B.B_PK1 = C.B_PK1(+) AND B.B_PK2 = C.B_PK2(+) AND A.A_PK1 = 'AAABBBB' AND NVL(B.B_QTY,0) > 0 AND NVL(C.C_QTY,0) > 0 GROUP BY A.A_PK1, A.A_PK2
안녕하세요 질문드립니다
A와 B는 1:N 관계이고, B와 C도 1:N 관계입니다.
이때 C는 아우터조인인데 C는 C_QTY >0 인 로우들만 걸러와야합니다
이럴 경우 어떻게 짜야할까요? A와B만 조인한 인라인뷰 만들고, B랑 C 조인한 인라인뷰를 따로 만들어서
아우터 조인을 걸어줘야할까요?
1. 아우터 조인
- NVL(, 0) > 0 조건은 NVL 하건 안하건 동일한 자료가 나오니 NVL 불필요 합니다.
- C 를 아우터 조인 걸려면 조인조건뿐만 아니라 상수조건에도 (+)를 붙여주면 됩니다.
- 변경전 : AND NVL(c.c_qty, 0) > 0
- 변경후 : AND c.c_qty(+) > 0
2. 다대다 조인의 문제점
- A:B:C 가 1:M:N 관계가 된다면? 다:다 조인으로 인해 값이 뻥튀기가 됩니다.
- , SUM(a.a_qty) -- M * N 만큼 뻥튀기 됨
- , SUM(b.b_qty) -- N 만큼 뻥튀기 됨
- , SUM(c.c_qty) -- 정상 조회
- 이 부분 맞게 작성된 건지 의문입니다.
- A:B:C 가 1:M:N 관계가 아니라
- A:B 가 1:M 관계
- A:C 가 1:N 관계
- 이렇게 두가지 관계로 나누어 지는게 아닐런지?
- B:C 가 1:N 관계가 되려면? 조인조건이 pk1, pk2 외에 pk3 가 더 있어야 하는게 아닌지?
SELECT a_pk1 , a_pk2 , a_qty , SUM(b_qty) b_qty , SUM(c_qty) c_qty FROM (SELECT a.a_pk1 , a.a_pk2 , a.a_qty , b.b_qty , SUM(c.c_qty) c_qty FROM tb_a a , tb_b b , tb_c c WHERE 1=1 AND a.a_pk1 = b.a_pk1 AND a.a_pk2 = b.a_pk2 AND b.b_pk1 = c.b_pk1(+) AND b.b_pk2 = c.b_pk2(+) AND a.a_pk1 = 'AAABBBB' AND b.b_qty > 0 AND c.c_qty(+) > 0 GROUP BY a.a_pk1, a.a_pk2, a.a_qty , b.b_pk1, b.b_pk2, b.b_qty ) GROUP BY a_pk1, a_pk2, a_qty ;