트리 구조에서 하위검색시 상위가 있을시 함께 표시 방법 문의 드립니다. 1 4 6,000

by 동동동 [SQL Query] oracle sql [2022.04.29 13:35:22]


안녕하세요..저번에 마농님의 도움으로 쿼리를 잘 응용해서 사용하고 있습니다..감사합니다..

http://www.gurubee.net/article/85161

그런데 이번에는 트리구조에서 하위가 검색대상이었을 경우 상위가 있을시 함께 표시를 해주고 싶은데요..

WITH MST_LST AS (
SELECT 'AA' CD, 'A상점' NM, 'G' GROUP_TYPE, 'F' CD_TYPE, 1 SEQ FROM DUAL UNION ALL 
SELECT 'BB' CD, 'B상점' NM, 'M' GROUP_TYPE, 'F' CD_TYPE, 2 SEQ FROM DUAL UNION ALL
SELECT 'CC' CD, 'C상점' NM, 'G' GROUP_TYPE, 'V' CD_TYPE, 3 SEQ FROM DUAL UNION ALL
SELECT 'DD' CD, 'D상점' NM, 'G' GROUP_TYPE, 'F' CD_TYPE, 4 SEQ FROM DUAL UNION ALL
SELECT 'A' CD, '사과'   NM, 'S' GROUP_TYPE, 'F' CD_TYPE, 1 SEQ FROM DUAL UNION ALL
SELECT 'B' CD, '배'     NM, 'S' GROUP_TYPE, 'F' CD_TYPE, 2 SEQ FROM DUAL UNION ALL
SELECT 'C' CD, '복숭아' NM, 'S' GROUP_TYPE, 'F' CD_TYPE, 3 SEQ FROM DUAL UNION ALL
SELECT 'D' CD, '바나나' NM, 'S' GROUP_TYPE, 'F' CD_TYPE, 4 SEQ FROM DUAL UNION ALL
SELECT 'E' CD, '배추'   NM, 'S' GROUP_TYPE, 'V' CD_TYPE, 1 SEQ FROM DUAL UNION ALL
SELECT 'F' CD, '무우'   NM, 'S' GROUP_TYPE, 'V' CD_TYPE, 2 SEQ FROM DUAL UNION ALL
SELECT 'G' CD, '당근'   NM, 'S' GROUP_TYPE, 'V' CD_TYPE, 3 SEQ FROM DUAL
)
, MST_GROUP AS (
SELECT 'AA' GROUP_CD, 'A' SUB_CD FROM DUAL UNION ALL
SELECT 'AA' GROUP_CD, 'B' SUB_CD FROM DUAL UNION ALL
SELECT 'AA' GROUP_CD, 'C' SUB_CD FROM DUAL UNION ALL
SELECT 'AA' GROUP_CD, 'D' SUB_CD FROM DUAL UNION ALL
SELECT 'BB' GROUP_CD, 'C' SUB_CD FROM DUAL UNION ALL
SELECT 'BB' GROUP_CD, 'D' SUB_CD FROM DUAL UNION ALL
SELECT 'CC' GROUP_CD, 'E' SUB_CD FROM DUAL UNION ALL
SELECT 'CC' GROUP_CD, 'G' SUB_CD FROM DUAL UNION ALL
SELECT 'DD' GROUP_CD, 'BB' SUB_CD FROM DUAL UNION ALL
SELECT 'DD' GROUP_CD, 'A' SUB_CD FROM DUAL
)
SELECT * FROM (

SELECT SUBSTR(SYS_CONNECT_BY_PATH(A.CD,'/'), 2) AS CD_PATH -- 경로
     , LEVEL AS TREE_LV
     , A.CD_TYPE
     , CONNECT_BY_ROOT A.CD AS GROUP_CD
     , CONNECT_BY_ROOT A.NM AS GROUP_NM
     , A.CD
     , A.NM
     , LPAD(' ',4*(LEVEL-1))||A.NM AS NM_LV
     , A.SEQ
     , DECODE(A.GROUP_TYPE, 'S', DECODE(B.GROUP_CD, NULL, 2, 1), 1) KEY1
     , DECODE(A.GROUP_TYPE, 'S', DECODE(B.GROUP_CD, NULL, 3, 2), 2) KEY2
     , B.GROUP_CD AS SUB_GROUP_CD
 FROM MST_LST A
    , MST_GROUP B
WHERE A.CD = B.SUB_CD(+)
START WITH A.GROUP_TYPE IN ('G', 'M') OR B.GROUP_CD IS NULL  -- 그룹 및 하위표시(그룹에 그룹 풀어서 표시) + 그룹에 속하지 않은 하위 표시
CONNECT BY PRIOR A.CD = B.GROUP_CD
ORDER BY A.CD_TYPE
       , DECODE(A.GROUP_TYPE, 'S', DECODE(B.GROUP_CD, NULL, 2, 1), 1)
       , DECODE(A.GROUP_TYPE, 'S', DECODE(B.GROUP_CD, NULL, 3, 2), 2)
       , CONNECT_BY_ROOT A.CD
       , SYS_CONNECT_BY_PATH(LPAD(A.SEQ, 5, '0')||A.CD,'/') -- 그룹에 그룹인 경우 정렬
       , B.GROUP_CD NULLS FIRST
       , A.SEQ
       , A.CD
) T
--WHERE NM LIKE '%바나나%'
;

원본결과
NM_LV
A상점
    사과
    배
    복숭아
    바나나
B상점
    복숭아
    바나나
D상점
    사과
    B상점
        복숭아
        바나나
C상점
    배추
    당근
무우

 

1. 바나나를 검색시 (상위존재시 함께 표시)

NM_LV
A상점
    바나나
B상점
    바나나
D상점
    B상점
        바나나

 

2. 무우 검색시 (상위 미존재인 경우)

NM_LV
무우

 

 

by 마농 [2022.05.02 09:39:17]

원하는 결과가 뭔가요?


by 동동동 [2022.05.02 11:00:30]

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

테스트 결과를 계속 올리다 보니 본문이 지저분해 졌네요...본문을 수정 했습니다..

 


by 마농 [2022.05.02 13:47:07]
WITH mst_lst AS
(
SELECT 'AA' cd, 'A상점'  nm, 'G' group_type, 'F' cd_type, 1 seq FROM dual
UNION ALL SELECT 'BB', 'B상점' , 'M', 'F', 2 FROM dual
UNION ALL SELECT 'CC', 'C상점' , 'G', 'V', 3 FROM dual
UNION ALL SELECT 'DD', 'D상점' , 'G', 'F', 4 FROM dual
UNION ALL SELECT 'A' , '사과'  , 'S', 'F', 1 FROM dual
UNION ALL SELECT 'B' , '배'    , 'S', 'F', 2 FROM dual
UNION ALL SELECT 'C' , '복숭아', 'S', 'F', 3 FROM dual
UNION ALL SELECT 'D' , '바나나', 'S', 'F', 4 FROM dual
UNION ALL SELECT 'E' , '배추'  , 'S', 'V', 1 FROM dual
UNION ALL SELECT 'F' , '무우'  , 'S', 'V', 2 FROM dual
UNION ALL SELECT 'G' , '당근'  , 'S', 'V', 3 FROM dual
)
, mst_group AS
(
SELECT 'AA' group_cd, 'A' sub_cd FROM dual
UNION ALL SELECT 'AA', 'B'  FROM dual
UNION ALL SELECT 'AA', 'C'  FROM dual
UNION ALL SELECT 'AA', 'D'  FROM dual
UNION ALL SELECT 'BB', 'C'  FROM dual
UNION ALL SELECT 'BB', 'D'  FROM dual
UNION ALL SELECT 'CC', 'E'  FROM dual
UNION ALL SELECT 'CC', 'G'  FROM dual
UNION ALL SELECT 'DD', 'BB' FROM dual
UNION ALL SELECT 'DD', 'A'  FROM dual
)
SELECT *
  FROM (SELECT a.cd_type
             , a.group_type
             , b.group_cd
             , a.cd
             , a.nm
             , a.seq
             , CONNECT_BY_ISLEAF isleaf
          FROM mst_lst a
             , mst_group b
         WHERE a.cd = b.sub_cd(+)
         START WITH a.nm LIKE '바나나'
         CONNECT BY PRIOR b.group_cd = a.cd
        )
 START WITH group_type IN ('G', 'M') OR isleaf = 1
 CONNECT BY PRIOR cd = group_cd
 ORDER SIBLINGS BY cd_type, seq
;

 


by 동동동 [2022.05.02 14:19:04]

마농님 정말 감사드립니다..꾸벅..

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