Where The Streets Have No Name

oracle 9iR2 - SYS_CONNECT_BY_PATH() 함수 본문

Developement/DataBase

oracle 9iR2 - SYS_CONNECT_BY_PATH() 함수

highheat 2006. 4. 13. 10:50
사용법은 SYS_CONNECT_BY_PATH(컬럼명, 구분자)

SELECT LPAD('' '', 2*LEVEL-1)||SYS_CONNECT_BY_PATH(ename, ''/'') "Path"
FROM scott.emp
START WITH ename = ''KING''
CONNECT BY PRIOR empno = mgr;

Path
------------------------------------------------------------
/KING
/KING/JONES
/KING/JONES/SCOTT
/KING/JONES/SCOTT/ADAMS
/KING/JONES/FORD
/KING/JONES/FORD/SMITH
/KING/BLAKE
/KING/BLAKE/ALLEN
/KING/BLAKE/WARD
/KING/BLAKE/MARTIN
/KING/BLAKE/TURNER
/KING/BLAKE/JAMES
/KING/CLARK
/KING/CLARK/MILLER

14 rows selected.


문제는 보통은 부모레벨로부터 자식레벨이 나오는것을 위에서와 같이 어떤 자식
이 부모를 참조하는지를 나타내는것이네요..
머리를 굴려보니...
위와 반대로 하면 어떨까요...
그래서..

START WITH 최상위레벨 ----> 없으면 모든 ROW가 시작행
CONNECT BY 자식 = 부모 ----> CONNECT BY 부모 = 자식

이렇게 하면 최하위레벨이 최상위레벨이 되는거죠...
이렇게 해서 QUERY해보면..


SELECT ACODE, SYS_CONNECT_BY_PATH(ACODE,''/'') "PATH"
FROM TBLA
CONNECT BY PRIOR p_ACODE = ACODE



ACODE PATH
---------------------------------------------------
m9 , /m9
m7 , /m9/m7
m2 , /m9/m7/m2
m0 , /m9/m7/m2/m0
................중략.........
m6 , /m6
m1 , /m6/m1
m0 , /m6/m1/m0
m4 , /m4
m1 , /m4/m1
m0 , /m4/m1/m0
m3 , /m3
m1 , /m3/m1
m0 , /m3/m1/m0