Database

꼬리에꼬리를 물어 찾아가는 SQL

그녕이 2008. 9. 19. 12:27

DROP TABLE KENNYTEST;

 

CREATE TABLE KENNYTEST
(
XPS_ID VARCHAR2(8),
PRE_XPS_ID VARCHAR2(8)
);

 

INSERT INTO KENNYTEST(XPS_ID, PRE_XPS_ID) VALUES('X1', '*');
INSERT INTO KENNYTEST(XPS_ID, PRE_XPS_ID) VALUES('X2', 'X1');
INSERT INTO KENNYTEST(XPS_ID, PRE_XPS_ID) VALUES('X3', 'X2');
INSERT INTO KENNYTEST(XPS_ID, PRE_XPS_ID) VALUES('Y1', '*');
INSERT INTO KENNYTEST(XPS_ID, PRE_XPS_ID) VALUES('Y2', 'Y1');
INSERT INTO KENNYTEST(XPS_ID, PRE_XPS_ID) VALUES('Z1', '*');
INSERT INTO KENNYTEST(XPS_ID, PRE_XPS_ID) VALUES('Z2', 'Z1');
INSERT INTO KENNYTEST(XPS_ID, PRE_XPS_ID) VALUES('Z3', 'Z2');
INSERT INTO KENNYTEST(XPS_ID, PRE_XPS_ID) VALUES('Z4', 'Z3');

 

 

 

 

SELECT  * FROM KENNYTEST;


SELECT  SUBSTR(XPS_ID_CON,- LENGTHB(XPS_ID_CON) + 1) RESULT_VALUE
FROM    (
        SELECT  XPS_ID_CON
               ,XPS_ID
               ,PRE_XPS_ID
               ,RN
               ,LV
               ,DECODE(XPS_ID,LEAD(PRE_XPS_ID) OVER( ORDER BY RN),'F','T') IS_LEAF
        FROM    (
                SELECT  SYS_CONNECT_BY_PATH(XPS_ID,'>') XPS_ID_CON
                       ,XPS_ID
                       ,PRE_XPS_ID
                       ,ROWNUM RN
                       ,LEVEL LV
                FROM    KENNYTEST   A
                CONNECT BY
                PRIOR A.XPS_ID = A.PRE_XPS_ID
                START WITH PRE_XPS_ID = '*'
                ORDER SIBLINGS BY XPS_ID
                )
       )
WHERE   IS_LEAF = 'T'
;

 

------------------

결과

------------------

X1>X2>X3
Y1>Y2
Z1>Z2>Z3>Z4