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와 조인을 걸어줘야 합니다
어떻게 수정하면 좋을까요? 문제 설명이 잘 되었을지 모르겠습니다ㅠㅠ
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(+) ;
원하는 결과값을 불러 오지 못하고 있습니다ㅠㅠ
수정해서 조건을 아래처럼 변경해도
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(+)
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 ;
너무 감사합니다ㅠㅠ 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가 특정값인 로우도 있고, * 인 로우도 있을때 아우터 조인으로 인한 중복 출력이 문제가 되어서 질문 드린거였어요~