一条sql语句查询出树中所有叶子的指定父节点的下级节点


一条sql语句查询出树中所有叶子的指定父结点的下级结点


或者说


查询出树中指定父结点下的下级结点与所有对应的叶子


 


如指定的树的结点Init_Parent_ID1


结点Init_Parent_ID1的下级结点为:


select  parent_id  ,org_id  from lab_org  t  where   t.parent_id=1

  parent_id org_id

1 1 1142
2 1 516
3 1 1121
4 1 398
5 1 1174
6 1 1150
7 1 303
8 1 804
9 1 229
10 1 591
11 1 941
12 1 2
13 1 1164
14 1 161
15 1 180
16 1 171
17 1 4150
18 1 4245


需求:指定的树的结点,要查询该结点的下级结点与所有对应的叶子


--**********


注意有的叶子往上查可以不是在指定父结点下等异常的处理;当指定的父结点是倒二级的结点;


 


 思路:


 1.利用oralcestartwith函数查询指定结点的下级结点与所有对应的叶子的路径,


 查询对应的路径sys_connect_by_path(org_id,'/'),深度level,是否是叶子connect_by_isleafisleaf


 2.利用字符函数处理sys_connect_by_path(org_id,'/')产生的路径,截取下级结点及叶子


 


--*********************示例*************


select


case


when tree_level=then


 substr(path,instr(path,'/',1,tree_level)+1,length(path)-instr(path,'/',1,tree_level)+1)


when tree_level>then


 substr(path,instr(path,'/',1,1)+1,instr(path,'/',1,2)-instr(path,'/',1,1)-1)

 end

 as parent_id

 ,

 substr(path,instr(path,'/',1,tree_level)+1,length(path)-instr(path,'/',1,tree_level)+1)


 as org_id_leaf


 from (

select

 '1'as init_org_id,

 levelas tree_level,org_level,sys_connect_by_path(org_id,'/'as path ,connect_by_isleaf isleaf

 from lab_org t where del=and connect_by_isleaf=1

 start with parent_id=connect by parent_id=prior org_id

)


--*********************


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值