set feedback off
create table test_connect_by (
parent number,
child number,
constraint uq_tcb unique (child)
);
5 = 2+3
insert into test_connect_by values ( 5, 2);
insert into test_connect_by values ( 5, 3);
11 = 5+6
insert into test_connect_by values (11,5);
insert into test_connect_by values (11, 6);
没有父节点的11
insert into test_connect_by values (null,11);
.....
依此类推,然后用CONNECT BY查询:
SELECT level, parent, child
from test_connect_by
START WITH parent is null
CONNECT BY PRIOR child = parent;
然后会得到一个树型的结果:
LEVEL PARENT CHILD
1 11
2 11 5
3 5 2
3 5 3
2 11 6
这比常规的查询已经快很多了. 但是有些应用在新版本的Oracle上还嫌不够快, 加上类似的优化参数:
ALTER SESSION SET "_OLD_CONNECT_BY_ENABLED" = true
区别在于, 这个参数为true的时候, CONNECT BY是靠index来实现的, 而该参数为false的时候, CONNECT BY使用了
buffer sort. 在数据量很大的时候, 使用index方式能明显感觉到速度的提高.
但是这样会有一个危险, 如果查询的对象是一个多表JOIN的VIEW而非TABLE的时候, 你可能会遇到异常:
ORA-01437: cannot have join with CONNECT BY