left outer join에서 inner table 조건 질문드립니다 1 5 1,157

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 조인한 인라인뷰를 따로 만들어서

아우터 조인을 걸어줘야할까요?

by 마농 [2021.03.18 09:30:22]

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 가 더 있어야 하는게 아닌지?


by 호호아줌마 [2021.03.18 09:41:45]

상세한 답변 감사드립니다!
A 는 주문 테이블이고
B 는 발주 테이블, C는 납품 테이블입니다.
A 로 주문이 10개 들어오면 발주는 보통 10개로 똑같이 들어가는데, C납품은 2개 8개 이런식으로 나눠 질 수 있다고 합니다. 정상 조회를 하기 위해서는 쿼리를 어떻게 변경하면 좋을까요ㅠㅠ?

앗 제가 잘못 쓴 부분이 있는데 저기서 SUM(A._QTY)는 들어가지 않습니다


by 마농 [2021.03.18 09:48:13]

보통 10개로 똑같이 들어가는데? --> 드믈게는 나누어 들어갈수도 있다는 말인가요?
각 테이블의 pk 및 조인 키가 어떻게 되나요?
pk1, pk2 식 말고 구체적으로 적어 주세요. (예 : 주문번호, 발주번호, 납품번호)


by 호호아줌마 [2021.03.18 10:43:50]

네 정상적인 프로세스라면 1:1지만 나누어 들어갈수 있게도 되어있습니다.

A테이블의 PK는 pk1 주문번호, pk2 주문시퀀스 입니다~
B테이블과 C테이블은 각각 발주번호, 발주시퀀스, 납품번호 납품시퀀스로 PK가 따로 있습니다.


by 마농 [2021.03.18 10:01:36]
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
;

 

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