if
object_id('[tb]')
is not null drop table [tb]gocreate table [tb]([modeid]
int,modename
varchar(20),parentid
int)insert [tb]select 100
,'商品管理',
0 union allselect 101
,'定单管理',
0 union allselect 102
,'用户管理',
0 union allselect 104
,'学院广告',
0 union allselect 105
,'系统设置',
0 union allselect 106
,'附件管理',
0 union allselect 107
,'商品管理',
100 union allselect 108
,'明细管理',
100 union allselect 109
,'物流管理',
100 union allselect 110
,'商品信息管理',
107 union allselect 111
,'商品分类管理',
107 union allselect 112
,'回收站管理',
107 union allselect 114
,'团购管理',
108 union allselect 115
,'拍卖管理',
108 union allselect 116
,'优惠管理',
108 union allselect 117
,'会员管理',
102 union allselect 118
,'会员卡管理',
102 union allselect 119
,'资金管理',
102 union allselect 120
,'管理员管理',
102 union allselect 121
,'添加管理员',
120 union allselect 122
,'修改管理员',
120go --查所有子结点if
object_id('f_getC')
is not null drop function f_getCgocreate function f_getC(@id
int)
returns @re
table(id
int,level int,sort
varchar(10))
asbegin 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 returnendgo
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 0107
100 ┝商品管理 100 1108
100 ┝明细管理 100 1109
100 ┝物流管理 100 1101
0 ┝定单管理 101 0102
0 ┝用户管理 102 0117
102 ┝会员管理 102 1118
102 ┝会员卡管理 102 1119
102 ┝资金管理 102 1120
102 ┝管理员管理 102 1104
0 ┝学院广告 104 0105
0 ┝系统设置 105 0106
0 ┝附件管理 106 0110
107 ┝商品信息管理 100 2111
107 ┝商品分类管理 100 2112
107 ┝回收站管理 100 2114
108 ┝团购管理 100 2115
108 ┝拍卖管理 100 2116
108 ┝优惠管理 100 2121
120 ┝添加管理员 102 2122
120 ┝修改管理员 102 2 (所影响的行数为
21 行) */ --查所有子结点,带路径与排序if
object_id('f_getC')
is not null drop function f_getCgocreate function f_getC(@id
int)
returns @re
table(id
int,level int,sort
varchar(100),path
varchar(500))
asbegin 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 returnendgo
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
行受影响) */ ----------
本文介绍了一种使用SQL实现树形结构数据查询的方法,包括创建表、插入数据、定义递归函数来获取指定节点的所有子节点及其路径和排序。通过实际例子展示了如何构造递归查询以实现多层次的数据展示。
5178

被折叠的 条评论
为什么被折叠?



