내 자신 코드와 세부코드가 다른것에 포함되었는지 비교. 1 4 5,096

by 동동동 [SQL Query] oracle sql [2022.05.19 14:32:13]


안녕하세요..내자신 코드와 내가 가지고 있는 세부코드가 다른 코드와 중복되는지 찾고자 하는데요..

 

WITH 
MST_MAIN AS (   /* 마스터 */
SELECT 'AAA' CD, 'G' GUBUN FROM DUAL UNION ALL
SELECT 'BBB' CD, 'G' GUBUN FROM DUAL UNION ALL
SELECT 'CCC' CD, 'S' GUBUN FROM DUAL UNION ALL
SELECT 'DDD' CD, 'S' GUBUN FROM DUAL UNION ALL
SELECT 'EEE' CD, 'S' GUBUN FROM DUAL UNION ALL
SELECT 'FFF' CD, 'S' GUBUN FROM DUAL UNION ALL
SELECT 'GGG' CD, 'G' GUBUN FROM DUAL UNION ALL
SELECT 'HHH' CD, 'S' GUBUN FROM DUAL
)
, MST_SUB AS (  /* 세부마스터 */
SELECT 'AAA' MAIN_CD, 'CCC' SUB_CD FROM DUAL UNION ALL
SELECT 'AAA' MAIN_CD, 'DDD' SUB_CD FROM DUAL UNION ALL
SELECT 'BBB' MAIN_CD, 'EEE' SUB_CD FROM DUAL UNION ALL
SELECT 'BBB' MAIN_CD, 'CCC' SUB_CD FROM DUAL UNION ALL
SELECT 'GGG' MAIN_CD, 'HHH' SUB_CD FROM DUAL
)
, TMP AS (     /* 입력데이터 */
SELECT 'AAA' CD FROM DUAL  UNION ALL
SELECT 'BBB' CD FROM DUAL  UNION ALL
SELECT 'GGG' CD FROM DUAL  UNION ALL
SELECT 'EEE' CD FROM DUAL
)
SELECT A.CD, B.GUBUN
    ,  CASE WHEN B.GUBUN = 'G' THEN
                A.CD || '::' || 
                (SELECT LISTAGG(S.SUB_CD, '::') WITHIN GROUP(ORDER BY S.SUB_CD)
                   FROM MST_SUB S
                  WHERE S.MAIN_CD = A.CD) || '::' 
            ELSE '' 
        END DETL_CD
  FROM TMP A, MST_MAIN B
 WHERE A.CD = B.CD

 

결과

CD GUBUN DETL_CD 중복여부
AAA G AAA::CCC::DDD:: Y
BBB G BBB::CCC::EEE:: Y
EEE S   Y
GGG G GGG::HHH:: N

 

저렇게 중복여부를 체크하려고 합니다.

입력데이터 (TMP) 에서

AAA는 BBB의 세부데이터 CCC가 중복되므로 중복여부 Y

EEE는 BBB의 세부데이터에 있기 때문에 중복, GGG는 GGG와 세부코드인 HHH가 어디에도 포함되지 않기 때문에 중복아님.

 

로직이 아닌 쿼리로 저렇게 중복체크가 가능할까요??..도움 부탁드립니다.

 

by 마농 [2022.05.19 15:20:27]

중복여부는 tmp 안에서만 찾으면 되나요?
아니면, tmp 이외의 것과 중복되는지도 확인해야 하나요?


by 동동동 [2022.05.19 16:16:31]

마농님 답변 감사드립니다..

TMP가 발생 데이터 이므로 TMP에서만 찾으면 됩니다..


by 마농 [2022.05.19 16:27:36]
SELECT cd
     , gubun
     , DECODE(gubun, 'G', cd || '::'
       || LISTAGG(sub_cd, '::') WITHIN GROUP(ORDER BY sub_cd)
       || '::') detl_cd
     , DECODE(MAX(cnt), 1, 'N', 'Y') dup_yn
  FROM (SELECT a.cd
             , b.gubun
             , c.sub_cd
             , COUNT(*) OVER(PARTITION BY NVL(c.sub_cd, a.cd)) cnt
          FROM tmp a
             , mst_main b
             , mst_sub  c
         WHERE a.cd = b.cd
           AND a.cd = c.main_cd(+)
        )
 GROUP BY cd, gubun
;

 


by 동동동 [2022.05.19 16:50:22]

마농님 매번 정말 감사드립니다...ㅠㅠ

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