轉載:SQL 遞歸樹 子父節點相互查詢

if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([modeid] int,modename varchar(20),parentid int)
insert [tb]
select 100 ,'商品管理', 0 union all
select 101 ,'定單管理', 0 union all
select 102 ,'用戶管理', 0 union all
select 104 ,'學院廣告', 0 union all
select 105 ,'系統設置', 0 union all
select 106 ,'附件管理', 0 union all
select 107 ,'商品管理', 100 union all
select 108 ,'明細管理', 100 union all
select 109 ,'物流管理', 100 union all
select 110 ,'商品信息管理', 107 union all
select 111 ,'商品分類管理', 107 union all
select 112 ,'回收站管理', 107 union all
select 114 ,'團購管理', 108 union all
select 115 ,'拍賣管理', 108 union all
select 116 ,'優惠管理', 108 union all
select 117 ,'會員管理', 102 union all
select 118 ,'會員卡管理', 102 union all
select 119 ,'資金管理', 102 union all
select 120 ,'管理員管理', 102 union all
select 121 ,'添加管理員', 120 union all
select 122 ,'修改管理員', 120
go
 
 
--查全部子結點
if object_id('f_getC') is not null drop function f_getC
go
create function f_getC(@id int) 
returns @re table(id int,level int,sort varchar(10)) 
as 
begin
    declare @l int 
    set @l=0 
    insert @re select @id,@l,null
    while @@rowcount>0
    begin 
        set @l=@l+1
        insert @re select a.modeid,@l,ltrim(isnull(b.sort,a.modeid)) from tb as a,@re as b 
 where b.id=a.parentid and b.level=@l-1
    end
    update @re set level = level -1
    return 
end 
go 
 
 
select a.modeid,a.parentid,REPLICATE('  ',b.level) +'┝'+a.modename,b.level,b.sort from tb  a,f_getC(0) b 
where a.modeid=b.id 
order by case when b.level<2 then 0 else 1 end,b.sort,b.level
 
/*
modeid      parentid                                                       sort       level      
----------- ----------- -------------------------------------------------- ---------- -----------
100         0           ┝商品管理                                              100        0
107         100           ┝商品管理                                            100        1
108         100           ┝明細管理                                            100        1
109         100           ┝物流管理                                            100        1
101         0           ┝定單管理                                              101        0
102         0           ┝用戶管理                                              102        0
117         102           ┝會員管理                                            102        1
118         102           ┝會員卡管理                                           102        1
119         102           ┝資金管理                                            102        1
120         102           ┝管理員管理                                           102        1
104         0           ┝學院廣告                                              104        0
105         0           ┝系統設置                                              105        0
106         0           ┝附件管理                                              106        0
110         107             ┝商品信息管理                                        100        2
111         107             ┝商品分類管理                                        100        2
112         107             ┝回收站管理                                         100        2
114         108             ┝團購管理                                          100        2
115         108             ┝拍賣管理                                          100        2
116         108             ┝優惠管理                                          100        2
121         120             ┝添加管理員                                         102        2
122         120             ┝修改管理員                                         102        2
 
(所影響的行數爲 21 行)
 
*/
 
 
--查全部子結點,帶路徑與排序
if object_id('f_getC') is not null drop function f_getC
go
create function f_getC(@id int) 
returns @re table(id int,level int,sort varchar(100),path varchar(500)) 
as 
begin
    declare @l int 
    set @l=0 
    insert @re
 select [modeid],@l,right('00000'+ltrim(modeid),5),modename
 from tb where parentid=@id
    while @@rowcount>0
    begin 
        set @l=@l+1
        insert @re
  select a.modeid,@l,b.sort+right('00000'+ltrim(a.modeid),5),
      b.path+' - '+a.modename
  from tb as a,@re as b 
  where b.id=a.parentid and b.level=@l-1
    end
    update @re set level = level
    return 
end 
go 
 
select a.modeid,a.parentid,REPLICATE('  ',b.level) +'┝'+a.modename,b.level,b.sort ,b.path from tb  a,f_getC(0) b 
where a.modeid=b.id 
order by sort
 
/*
modeid      parentid                         level                           
----------- ----------- -------------------- ----------- -------------------- ----------------------------------------
100         0           ┝商品管理                0           00100                商品管理
107         100           ┝商品管理              1           0010000107           商品管理 - 商品管理
110         107             ┝商品信息管理          2           001000010700110      商品管理 - 商品管理 - 商品信息管理
111         107             ┝商品分類管理          2           001000010700111      商品管理 - 商品管理 - 商品分類管理
112         107             ┝回收站管理           2           001000010700112      商品管理 - 商品管理 - 回收站管理
108         100           ┝明細管理              1           0010000108           商品管理 - 明細管理
114         108             ┝團購管理            2           001000010800114      商品管理 - 明細管理 - 團購管理
115         108             ┝拍賣管理            2           001000010800115      商品管理 - 明細管理 - 拍賣管理
116         108             ┝優惠管理            2           001000010800116      商品管理 - 明細管理 - 優惠管理
109         100           ┝物流管理              1           0010000109           商品管理 - 物流管理
101         0           ┝定單管理                0           00101                定單管理
102         0           ┝用戶管理                0           00102                用戶管理
117         102           ┝會員管理              1           0010200117           用戶管理 - 會員管理
118         102           ┝會員卡管理             1           0010200118           用戶管理 - 會員卡管理
119         102           ┝資金管理              1           0010200119           用戶管理 - 資金管理
120         102           ┝管理員管理             1           0010200120           用戶管理 - 管理員管理
121         120             ┝添加管理員           2           001020012000121      用戶管理 - 管理員管理 - 添加管理員
122         120             ┝修改管理員           2           001020012000122      用戶管理 - 管理員管理 - 修改管理員
104         0           ┝學院廣告                0           00104                學院廣告
105         0           ┝系統設置                0           00105                系統設置
106         0           ┝附件管理                0           00106                附件管理
 
(21 行受影響)
 
 
*/
 
----------
相關文章
相關標籤/搜索