一條sql語句查詢出樹中所有葉子的指定父節點的下級節點
一條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
111142
21516
311121
41398
511174
611150
71303
81804
91229
101591
111941
1212
1311164
141161
151180
161171
1714150
1814245
需求:指定的樹的結點,要查詢該結點的下級結點與所有對應的葉子
--**********
注意有的葉子往上查可以不是在指定父結點下等異常的處理;當指定的父結點是倒二級的結點;
思路:
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)+
as org_id_leaf
from (
select
'1'asinit_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 byparent_id=prior org_id
)
--*********************