안녕하세요..저번에 마농님의 도움으로 쿼리를 잘 응용해서 사용하고 있습니다..감사합니다..
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 |
| 무우 |
원하는 결과가 뭔가요?
마농님 답글 감사드립니다.
테스트 결과를 계속 올리다 보니 본문이 지저분해 졌네요...본문을 수정 했습니다..
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
;
마농님 정말 감사드립니다..꾸벅..