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

)


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


 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章