10g树形查询新特性CONNECT_BY_ROOT的9i实现方式
上一篇 / 下一篇 2008-07-16 23:17:52 / 个人分类:ORACLE
在
这里描述一下在9i中如何实现相应的功能。
首先还是构造一个例子:
SQL> CREATE TABLE T_TREE (ID NUMBER PRIMARY KEY, FATHER_ID NUMBER, NAME VARCHAR2(30));
表已创建。
SQL> INSERT INTO T_TREE VALUES (1, 0, 'A');
已创建1行。
SQL> INSERT INTO T_TREE VALUES (2, 1, 'BC');
已创建1行。
SQL> INSERT INTO T_TREE VALUES (3, 1, 'DE');
已创建1行。
SQL> INSERT INTO T_TREE VALUES (4, 1, 'FG');
已创建1行。
SQL> INSERT INTO T_TREE VALUES (5, 2, 'HIJ');
已创建1行。
SQL> INSERT INTO T_TREE VALUES (6, 4, 'KLM');
已创建1行。
SQL> INSERT INTO T_TREE VALUES (7, 6, 'NOPQ');
已创建1行。
SQL> COMMIT;
提交完成。
SQL> SELECT * FROM T_TREE;
ID FATHER_ID NAME
@FjrQ,b
x/U0---------- ---------- ------------------------------ITPUB个人空间 A*G7Ii
CLv
rC"Q_
1
#M8wU5c1J Hv)N:b4F0 2 1 BC
5O/}nHhU4E*F0 3 1 DEITPUB个人空间"G}4o;c2d6IB(nlZ
4 1 FG
@h;Q0G0mp(|]0 5 2 HIJITPUB个人空间1e0Gc L!mf\E)q
6 4 KLMITPUB个人空间4j5p1yu^7}
f
7 6 NOPQ
已选择7行。
下面看看CONNECT_BY_ROOT的功能:
SQL> SELECT ID, FATHER_ID, NAME, CONNECT_BY_ROOT(NAME) ROOT_NAMEITPUB个人空间*V(^R5N Nkf
2 FROM T_TREE
$ru|h7}?WX-l6X8D0 3 START WITH FATHER_ID = 0ITPUB个人空间 s-M8H(j5dV1cW
4 CONNECT BY PRIOR ID = FATHER_ID;
ID FATHER_ID NAME ROOT_NAME
!]?T W,^D0---------- ---------- ---------- ----------
i
}wZY;r0 1
YlOhQ!Ig:@0 2 1 BC A
"X d*}/^X6Q0 5 2 HIJ A
2eQQi4z0 3 1 DE AITPUB个人空间*n{T
?6Lit
4 1 FG AITPUB个人空间+~ wk~-Z\
6 4 KLM A
1[j,lE}w7v'J:Gu L i&p0 7 6 NOPQ A
已选择7行。
SQL> SELECT ID, FATHER_ID, NAME,
L]1s@
G5a0 2 CONNECT_BY_ROOT(NAME) ROOT_NAME, CONNECT_BY_ROOT(ID) ROOT_ID
.n$pQHb#jqrE)f0 3 FROM T_TREE
3z`w`R6i~
nY0 4 START WITH ID = 7ITPUB个人空间b~ Vy&r+~s
5 CONNECT BY PRIOR FATHER_ID = ID;
ID FATHER_ID NAME ROOT_NAME ROOT_ID
_
l2i.vW*W'V/LR'k0---------- ---------- ---------- ---------- ----------ITPUB个人空间Ph#|[r!x\
7 6 NOPQ NOPQ 7
:t,AQ!v#K0 6 4 KLM NOPQ 7ITPUB个人空间/rE$F`i
4 1 FG NOPQ 7ITPUB个人空间#I7c&CzaV
1
CONNECT_BY_ROOT操作的功能就是获取根节点记录的字段信息。这个功能在9i当中可以利用SYS_CONNECT_BY_PATH来实现。
SQL> SELECT ID,ITPUB个人空间ktXO"^$V(z"H
2 FATHER_ID,ITPUB个人空间P.F`dQE V
3 NAME,
_q,\ }+`0 4 SUBSTR
5OyYrr5n
ttD{0 5 (