oracle的树函数,【PL/SQL】Oracle--树的使用(Connect By)

表    tree字段   mastersubsalesinsert into tree values('主1',   '主2',  15);insert into tree values('主1',   '主3',  20);insert into tree values('主2',   '主4',  5);insert into tree values('主2',   '主5',  10);insert into tree values('主3',   '主5',  30);insert into tree values('主3',   '主6',  40);SQL> select * from tree;MASTER   SUB       SALES---------- ---------- ----------主1    主2        15主1    主3        20主2    主4         5主2    主5        10主3    主5        30主3    主6        40如果用树型结构表示如下:'主1'-'主2'--'主4'--'主5''主1'-'主3'--'主5'--'主6'SQL> select * from treestart with sub='主2'     --相当于普通sql的where条件connect by prior master=sub; --遍历的顺序是sub先于master遍历,也就是说从sub往上遍历一直到master(根节点)2MASTER   SUB       SALES---------- ---------- ----------主1    主2        15SQL> select * from treestart with master='主2'connect by prior master=sub; --sub往上遍历至根节点(参考一下树型图)2  3MASTER   SUB       SALES---------- ---------- ----------主2    主4         5  --这条是自己本身,也就是第一遍遍历主1    主2        15  --这是第2次遍历,我们从树型图可以看到,'主2'往上遍历是'主1'主2    主5        10主1    主2        15好,我们关看上面可能还是不好理解,我们加入一个树结构专用函数sys_connect_by_path,便于理解SQL> select sys_connect_by_path(MASTER,'/') from tree  --master表示我遍历的起点只找在master列中存在的,如下例只要'主2'为起点,并以/为分割符start with master='主2'connect by prior master=sub;  --往根节点遍历2  3SYS_CONNECT_BY_PATH(MASTER,'/')--------------------------------------------------------------------------------/主2             --第1遍遍历/主2/主1          --第2遍遍历/主2             --第2条master='主2'的记录的第1次遍历/主2/主1          --第2条master='主2'的记录的第2次遍历SQL> select sys_connect_by_path(MASTER,'/') from tree --起点为sub='主5'时MASTER=主2,主3start with sub='主5'connect by prior master=sub;2  3SYS_CONNECT_BY_PATH(MASTER,'/')--------------------------------------------------------------------------------/主2/主2/主1/主3/主3/主1SQL> select sys_connect_by_path(MASTER,'/'),sub,master from treestart with sub is not nullconnect by prior master=sub;2  3SYS_CONNECT_BY_PATH(MASTER,'/' SUB    MASTER------------------------------ ---------- ----------/主1              主2    主1 --找主1到根的路径,这里根是主1他自己/主1              主3    主1/主2              主4    主2/主2/主1           主2    主1 --找主2到根的路径,这里根是主1/主2              主5    主2/主2/主1           主2    主1/主3              主5    主3/主3/主1           主3    主1/主3              主6    主3/主3/主1           主3    主1select sys_connect_by_path(MASTER,'/'),sub,master from treestart with sub is not nullconnect by prior sub = master;SYS_CONNECT_BY_PATH(MASTER,'/' SUB    MASTER------------------------------ ---------- ----------/主1              主2    主1/主1/主2           主4    主2/主1/主2           主5    主2/主1              主3    主1/主1/主3           主5    主3/主1/主3           主6    主3/主2              主4    主2/主2              主5    主2/主3              主5    主3/主3              主6    主3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值