您的位置:首页 > 其它

通过连接实现层级函数(4)

2010-02-24 21:52 197 查看
以上的问题是只有知道树的结构才可以遍历,如果不知道怎么办呢 那么咱们可以用connect by 函数来让他自己遍历

咱们通过定位起点start with 来实现,指定你要遍历的parent_col 和 child_col 就可以了,prior 放在提供用于检索的字面值的列前面,实际prior是用于定位父子关系的,prior放在父节点的字段之前

start with

connect by col1 = prior col2

还是上次用的环境

SQL> select * from direct;

ID NAME                  PARENT_ID
---------- -------------------- ----------
1 oracle
2 assistants                    1
3 BIN                           1
4 RDBMS                         1
5 ADMIN                         4
6 demo                          4
7 install                       4
8 jlib                          4
9 catcr.sql                     5
10 catawrvw.sql                  5

10 rows selected.


SQL> select * from direct
2  start with parent_id is null
3  connect by parent_id = prior id
4  ;

ID NAME                  PARENT_ID
---------- -------------------- ----------
1 oracle
2 assistants                    1
3 BIN                           1
4 RDBMS                         1
5 ADMIN                         4
9 catcr.sql                     5
10 catawrvw.sql                  5
6 demo                          4
7 install                       4
8 jlib                          4


发现没,实际用connect by 是把每个分支一直遍历到叶子节点才肯切换到下一个子节点继续遍历,简直就是吸干了一个子节点,才肯换到另一个子节点。

这种样子太难看换显示方法

lpad函数就是如果第一个参数不满足第二个参数设定的长度,那么从左开始自动补充第三个参数指定的字符。这里没有指定第三个参数默认为空格space,

SQL> r
1  select level,lpad(' ',level*2-1) || '|' || name AS "Name"
2  from direct
3  start with parent_id is null
4* connect by prior id = parent_id

LEVEL Name
----- --------------------
1  |oracle
2    |assistants
2    |BIN
2    |RDBMS
3      |ADMIN
4        |catcr.sql
4        |catawrvw.sql
3      |demo
3      |install
3      |jlib


说实话这样还是难看,那么咱们继续改

SQL> r
1  select  id,sys_connect_by_path(name,'/') name
2  from direct
3  start with parent_id is null
4* connect by prior id = parent_id

ID NAME
---------- -----------------------------------
1 /oracle
2 /oracle/assistants
3 /oracle/BIN
4 /oracle/RDBMS
5 /oracle/RDBMS/ADMIN
9 /oracle/RDBMS/ADMIN/catcr.sql
10 /oracle/RDBMS/ADMIN/catawrvw.sql
6 /oracle/RDBMS/demo
7 /oracle/RDBMS/install
8 /oracle/RDBMS/jlib


发现没这个sys_connect_by_path实际上是提供了上一级别的目录的名称,oracle还是很善解人意的嘛
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: