1. 程式人生 > >一條sql語句查詢出樹中所有葉子的指定父節點的下級節點

一條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

111142
21516
311121
41398
511174
611150
71303
81804
91229
101591
111941
1212
1311164
141161
151180
161171
1714150
1814245

需求:指定的樹的結點,要查詢該結點的下級結點與所有對應的葉子

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

注意有的葉子往上查可以不是在指定父結點下等異常的處理;當指定的父結點是倒二級的結點;

思路:

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'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=and connect_by_isleaf=1

start with parent_id=connect byparent_id=prior org_id

)

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