승적이익강 (勝敵而益强)
꼬리에꼬리를 물어 찾아가는 SQL 본문
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
'Database' 카테고리의 다른 글
[altibase] 64bit 윈도우에서 32bit ODBC관리자 사용하기 (0) | 2016.05.03 |
---|---|
쿼리실행예상시간(초) (0) | 2008.09.19 |
날짜 계산 SQL문 예시 (0) | 2008.09.19 |
일정 문자가 등장하는 개수를 세고 싶을때 (0) | 2008.09.19 |
Update~Select 문장 sample (0) | 2008.09.19 |