by 동동동 [SQL Query] oracle sql [2022.04.29 13:35:22]
안녕하세요..저번에 마농님의 도움으로 쿼리를 잘 응용해서 사용하고 있습니다..감사합니다..
http://www.gurubee.net/article/85161
그런데 이번에는 트리구조에서 하위가 검색대상이었을 경우 상위가 있을시 함께 표시를 해주고 싶은데요..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 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 |
무우 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | 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 ; |