by 초봉 [SQL Query] [2017.08.22 10:16:48]
계층 쿼리를 짜던중에 제목과 같이
계층쿼리에서 제일 하위 코드를 던지면 제일 높은 상위코드를 찾아서 그 하위의 코드를 찾을수 있을까요?
예시 데이터로는
cd | up_cd | lev |
01 | 1 | |
02 | 01 | 2 |
03 | 02 | 3 |
04 | 02 | 3 |
05 | 01 | 2 |
06 | 05 | 3 |
07 | 01 | 2 |
08 | 07 | 3 |
09 | 08 | 4 |
10 | 1 | |
11 | 10 | 2 |
12 | 11 | 3 |
13 | 1 |
위의 형태에 테이블에 데이터가 들어가 있고
현재 제가 파라미터로 쓰이는 값은 09 또는 06 또는 03,04 값을 하나만 던집니다.
03 이라고 던졌을때 제일 상위인 1lev 01 값을 찾아서 그 하위 tree 에 있는 마지막 cd 값을 찾을수 있을까요?
09,06,03,04 이렇게 값이 출력 될수 있을까요? 계층이다 보니 맨 아래 하위단 cd lev 값은 다를수 있더라구요. 도와주세요 ㅜㅜ
WITH T AS ( SELECT '01' CD , '' UPCD FROM DUAL UNION ALL SELECT '02' , '01' FROM DUAL UNION ALL SELECT '03' , '02' FROM DUAL UNION ALL SELECT '04' , '02' FROM DUAL UNION ALL SELECT '05' , '01' FROM DUAL UNION ALL SELECT '06' , '05' FROM DUAL UNION ALL SELECT '07' , '01' FROM DUAL UNION ALL SELECT '08' , '07' FROM DUAL UNION ALL SELECT '09' , '08' FROM DUAL ) SELECT * FROM (SELECT CD , CONNECT_BY_ISLEAF AS LEAF FROM T START WITH CD = '03' CONNECT BY CD = PRIOR UPCD ) WHERE LEAF = 1 ;
/* 하위값만 구하는식 */ WITH T AS ( SELECT '01' CD , '' UPCD FROM DUAL UNION ALL SELECT '02' , '01' FROM DUAL UNION ALL SELECT '03' , '02' FROM DUAL UNION ALL SELECT '04' , '02' FROM DUAL UNION ALL SELECT '05' , '01' FROM DUAL UNION ALL SELECT '06' , '05' FROM DUAL UNION ALL SELECT '07' , '01' FROM DUAL UNION ALL SELECT '08' , '07' FROM DUAL UNION ALL SELECT '09' , '08' FROM DUAL UNION ALL SELECT '10' , '' FROM DUAL UNION ALL SELECT '11' , '10' FROM DUAL UNION ALL SELECT '12' , '11' FROM DUAL UNION ALL SELECT '13' , '' FROM DUAL ) SELECT LISTAGG(CD,',') WITHIN GROUP(ORDER BY LV ) FROM (SELECT CONNECT_BY_ISLEAF AS LEAF , CD , UPCD , LEVEL LV FROM T START WITH CD = '01' CONNECT BY PRIOR CD = UPCD ) WHERE LEAF = 1