오라클 outer joind에서 조인조건에 관한 질문입니다 0 5 824

by 호호아줌마 [SQL Query] outer join [2021.12.22 11:32:30]


  TL_KTCN_CNWK_COST_LS A
, TL_ADD_INSL_UPRC_IN B

A가 outer table이고 B가 inner table일때 join 조건이 기존에
AND A.CO_GBCD = B.CO_GBCD(+)
AND A.ADD_INSL_COST_REP_CD = B.ADD_INSL_COST_REP_CD(+)
인데 새로운 조건
AND A.CNWK_VEN_DCST_CD = B.DCST_CD(+)를 추가하려고 합니다
이때 B 테이블의 DCST_CD 값은 * 또는 특정 값이 들어가는데
A.CNWK_VEN_DCST_CD = B.DCST_CD 일 경우는 B테이블의 일치하는 ROW와 조인을 걸어주고
A.CNWK_VEN_DCST_CD 가 일치하는 경우가 없을때는 B.DCST_CD ='*' 인 ROW와 조인을 걸어줘야 합니다

어떻게 수정하면 좋을까요? 문제 설명이 잘 되었을지 모르겠습니다ㅠㅠ

 

by 마농 [2021.12.22 12:39:59]
SELECT a.a.co_gbcd
     , a.add_insl_cost_rep_cd
     , a.cnwk_ven_dcst_cd
     , c.dcst_cd
  FROM tl_ktcn_cnwk_cost_ls a
     , tl_add_insl_uprc_in b
     , tl_add_insl_uprc_in c
 WHERE 1=1
   AND a.co_gbcd              = b.co_gbcd(+)
   AND a.add_insl_cost_rep_cd = b.add_insl_cost_rep_cd(+)
   AND a.cnwk_ven_dcst_cd     = b.dcst_cd(+)
   AND b.co_gbcd              = c.co_gbcd(+)
   AND b.add_insl_cost_rep_cd = c.add_insl_cost_rep_cd(+)
   AND NVL(b.dcst_cd, '*')    = c.dcst_cd(+)
;

 


by 호호아줌마 [2021.12.22 14:53:07]

원하는 결과값을 불러 오지 못하고 있습니다ㅠㅠ
수정해서 조건을 아래처럼 변경해도 
A.DCST_CD 값과 같은 B.DCST_CD 값이 있을 경우는 제대로 맵핑을 해오지만
A.DCST_CD 값이 B.DCST_CD 값에 없는경우( B.DCST_CD = '*' 에 걸려야하는 경우) 에는 B 테이블과 A 테이블의 조인에서 결과값이 없으므로 B와 C의 조인이 원하는대로 성립안되는거 같습니다
아래와 같이 변경하는건 안될까요? 일단은 원하는대로 C.ADD_INSL_COST_REP_CD 를 불러오고 있습니다.

SELECT B.ADD_INSL_COST_REP_CD
        , C.ADD_INSL_COST_REP_CD
        , B.DCST_CD
        , C.DCST_CD
  FROM tl_ktcn_cnwk_cost_ls A
, tl_add_insl_uprc_in B
, tl_add_insl_uprc_in C
WHERE 1=1
AND A.CO_GBCD = Z.CO_GBCD(+)
AND A.ADD_INSL_COST_REP_CD = Z.ADD_INSL_COST_REP_CD(+)
AND A.CNWK_VEN_DCST_CD = Z.DCST_CD(+)
AND A.CO_GBCD = C.CO_GBCD(+)
AND A.ADD_INSL_COST_REP_CD = C.ADD_INSL_COST_REP_CD(+)
AND NVL(B.DCST_CD, '*')  = C.DCST_CD(+)

 


by 마농 [2021.12.22 15:14:55]

질문에 제시된 대로 쿼리 작성해 드렸습니다.
안된다면? 질문의 내용에 누락된 부분이나 왜곡된 부분이 있을 것 같습니다.
댓글도 보면 Z 가 나오고 B 가 나오고 왔다 갔다 하네요.
좀더 명확하게 질문해 주셔야 하고
예시 자료를 볼 수 있으면 더 욱 좋습니다.

역시. 테스트 안하고 올렸더니...
생각으로만 작성한 쿼리는 동작하지 않네요.
다시 테스트 해보고 올릴께요.


by 마농 [2021.12.22 15:34:44]
WITH tl_ktcn_cnwk_cost_ls AS
(
SELECT 'a' co_gbcd, 'a' add_insl_cost_rep_cd, '1' cnwk_ven_dcst_cd FROM dual
UNION ALL SELECT 'a', 'a', '2' FROM dual
UNION ALL SELECT 'a', 'a', '3' FROM dual
UNION ALL SELECT 'a', 'a', '4' FROM dual
)
, tl_add_insl_uprc_in AS
(
SELECT 'a' co_gbcd, 'a' add_insl_cost_rep_cd, '1' dcst_cd, 'AA' nm FROM dual
UNION ALL SELECT 'a', 'a', '2', 'BB' FROM dual
UNION ALL SELECT 'a', 'a', '*', 'XX' FROM dual
)
SELECT a.co_gbcd
     , a.add_insl_cost_rep_cd
     , a.cnwk_ven_dcst_cd
     , b.dcst_cd
     , c.dcst_cd
     , c.nm
  FROM tl_ktcn_cnwk_cost_ls a
  LEFT OUTER JOIN tl_add_insl_uprc_in b
    ON a.co_gbcd              = b.co_gbcd
   AND a.add_insl_cost_rep_cd = b.add_insl_cost_rep_cd
   AND a.cnwk_ven_dcst_cd     = b.dcst_cd
  LEFT OUTER JOIN tl_add_insl_uprc_in c
    ON a.co_gbcd              = c.co_gbcd
   AND a.add_insl_cost_rep_cd = c.add_insl_cost_rep_cd
   AND NVL(b.dcst_cd, '*')    = c.dcst_cd
 WHERE 1=1
;

 


by 호호아줌마 [2021.12.22 16:04:12]

너무 감사합니다ㅠㅠ Z는 수정했습니다.
outer table이 되는 tl_ktcn_cnwk_cost_ls 이 시공금액내역 테이블이고 dcst_cd 가 거래선코드 입니다.
tl_add_insl_uprc_in  테이블은 거래선코드(DCST_CD)+어떤시공을 했는지에 대한 코드(ADD_INSL_COST_REP_CD)를 가지고 있는 시공종류별 단가의 마스터성 테이블입니다. 모든 거래선에 적용이 될 경우 DCST_CD값을 * 가지고 있고, 특정 거래선에 대한 단가가 다를 경우에 DCST_CD 값이 특정값을 가지고 있는 기존 쿼리가 저렇게 아우터 조인으로 구성이 되어있어서,  DCST_CD가 특정값인 로우도 있고, * 인 로우도 있을때 아우터 조인으로 인한 중복 출력이 문제가 되어서 질문 드린거였어요~
 

 

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