一条sql语句查询出树中所有叶子的指定父结点的下级结点
或者说
查询出树中指定父结点下的下级结点与所有对应的叶子
如指定的树的结点Init_Parent_ID为1,
结点Init_Parent_ID为1的下级结点为:
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.利用oralce的startwith函数查询指定结点的下级结点与所有对应的叶子的路径,
查询对应的路径sys_connect_by_path(org_id,'/'),深度level,是否是叶子connect_by_isleafisleaf
2.利用字符函数处理sys_connect_by_path(org_id,'/')产生的路径,截取下级结点及叶子
--*********************示例*************
select
case
when tree_level=1 then
substr(path,instr(path,'/',1,tree_level)+1,length(path)-instr(path,'/',1,tree_level)+1)
when tree_level>1 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=0 and connect_by_isleaf=1
start with parent_id=1 connect by parent_id=prior org_id
)
--*********************