1、第一种方法
SQL> SELECT TO_NUMBER(SUBSTR(PATH, 2, INSTR(PATH, '/', 2) - 2)) ROOT_ID, ID
2 FROM
3 (
4 SELECT SYS_CONNECT_BY_PATH(ID, '/') || '/' PATH, ID
5 FROM TEST
6 WHERE ROWNUM < 10
7 CONNECT BY PRIOR ID = FID
8 )
9 ;
ROOT_ID ID ------------ ------------
1 1
1 2
1 200516
1 2005859
1 2005862
1 2005864
1 2005866
1 2005867
1 2005865
已选择9行。
2、第二种方法
SELECT TO_NUMBER(SUBSTR(SYS_CONNECT_BY_PATH(ID,'/') || '/',2,INSTR(SYS_CONNECT_BY_PATH(ID,'/') || '/','/','2')-2)) ROOT_ID FROM TEST START WITH ID = 1 CONNECT BY PRIOR ID = FID;
3、第三种方法
SELECT TO_NUMBER(SUBSTR(PATH,2,INSTR(PATH,'/','2')-2)) ROOT_ID FROM (SELECT SYS_CONNECT_BY_PATH(ID,'/') || '/' PATH FROM TEST START WITH ID=1 CONNECT BY PRIOR ID = FID);
测试第三中方法的效率比较高。
以上是Oracle9i提供的算法
Oracle 10g提供了 伪列或者说(函数)
SELECT CONNECT_BY_ROOT(ID),ID FROM TEST CONNECT BY PRIOR ID = FID;
最快