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