SQL排成树状结构

asd889839 2012-11-08 07:07:20
ModuleID ModuleName ParentID
10 系统配置 0
11 模块管理 10
12 添加模块 11
14 模块列表 11
15 角色管理 10
16 添加角色 15
17 角色列表 15
25 用户管理 0
26 添加用户 25
27 用户列表 25
28 权限管理 10

怎么排成树状的结构?

ModuleID ModuleName ParentID
10 系统配置 0
11 模块管理 10
12 添加模块 11
14 模块列表 11
15 角色管理 10
16 添加角色 15
17 角色列表 15
28 权限管理 10
25 用户管理 0
26 添加用户 25
27 用户列表 25
...全文
490 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
坚_持 2012-11-13
  • 打赏
  • 举报
回复
弄了半天还没有注意楼上大哥都回答了 我们的做法都是一样的

declare @tx TABLE(ModuleID INT , ModuleName NVARCHAR(20),ParentID int )
INSERT INTO @tx
SELECT 10,'系统配置',0 UNION ALL
SELECT 11,'模块管理' ,10 UNION ALL
SELECT 12,'添加模块' ,11 UNION ALL
SELECT 14,'模块列表',11 UNION ALL
SELECT 15,'角色管理',10 UNION ALL
SELECT 16,'添加角色',15 UNION ALL
SELECT 17,'角色列表',15 UNION ALL
SELECT 25,'用户管理',0 UNION ALL
SELECT 26, '添加用户',25 UNION ALL
SELECT 27, '用户列表',25 UNION ALL
SELECT 28,'权限管理',10
;with cte_table as(select *,1 F,cast(ModuleName as nvarchar(4000)) M from @tx where ParentID = 0
union all
select t.*,ct.F+1,M+','+t.ModuleName from cte_table as ct,@tx as t where ct.ModuleID = t.ParentID)
select ct.ModuleID,ct.ModuleName,ct.ParentID from cte_table as ct order by ct.M


冰岛男孩 2012-11-12
  • 打赏
  • 举报
回复
强大的一毛啊
haitao 2012-11-09
  • 打赏
  • 举报
回复
还可以加上缩进层次的

declare @t TABLE(ModuleID INT , ModuleName NVARCHAR(10),ParentID int )
INSERT INTO @t 
SELECT 10,    '系统配置' ,    0
UNION ALL SELECT 11,  '模块管理' ,    10
UNION ALL SELECT 12,  '添加模块' ,    11
UNION ALL SELECT 14,  '模块列表' ,    11
UNION ALL SELECT 15,  '角色管理' ,    10
UNION ALL SELECT 16,  '添加角色' ,    15
UNION ALL SELECT 17,  '角色列表' ,    15
UNION ALL SELECT 25,  '用户管理' ,    0
UNION ALL SELECT 26,  '添加用户'  ,   25
UNION ALL SELECT 27,  '用户列表' ,    25
UNION ALL SELECT 28,  '权限管理',     10

with cte as
(
select *,1 flevel,cast(ModuleName as nvarchar(4000)) fo from @t where ParentID=0
union all
select b.*,a.flevel+1,fo+'\'+b.ModuleName  from cte a 
join @t b on a.ModuleNameID=b.ParentID
)
select * from cte
order by fo
快溜 2012-11-09
  • 打赏
  • 举报
回复
递归查询排序。
gogodiy 2012-11-09
  • 打赏
  • 举报
回复
楼主的意思是在UI端显示出树状结构?
發糞塗牆 2012-11-08
  • 打赏
  • 举报
回复
我最希望可以直接在order by 里面用case when来实现,但是弄了很久弄不出来。
引用 2 楼 fredrickhu 的回复:
引用 1 楼 DBA_Huangzj 的回复:想不出什么好的办法 SQL code 1234567891011121314151617181920212223242526272829303132333435363738 --CREATE TABLE test (ModuleID INT , ModuleName NVARCHAR(10),P……
發糞塗牆 2012-11-08
  • 打赏
  • 举报
回复
无比膜拜
--小F-- 2012-11-08
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
想不出什么好的办法 SQL code 1234567891011121314151617181920212223242526272829303132333435363738 --CREATE TABLE test (ModuleID INT , ModuleName NVARCHAR(10),ParentID int ) --INSERT INTO test ……
BOM按节点排序 就这样 你还想哪样?
發糞塗牆 2012-11-08
  • 打赏
  • 举报
回复
想不出什么好的办法
--CREATE TABLE  test (ModuleID INT , ModuleName NVARCHAR(10),ParentID int )
 --INSERT INTO test 
 -- SELECT 10,	 '系统配置' ,    0
 --UNION ALL SELECT 11,	 '模块管理' ,    10
 --UNION ALL SELECT 12,	 '添加模块' ,    11
 --UNION ALL SELECT 14,	 '模块列表' ,    11
 --UNION ALL SELECT 15,	 '角色管理' ,    10
 --UNION ALL SELECT 16,	 '添加角色' ,    15
 --UNION ALL SELECT 17,	 '角色列表' ,    15
 --UNION ALL SELECT 25,	 '用户管理' ,    0
 --UNION ALL SELECT 26,	 '添加用户'  ,   25
 --UNION ALL SELECT 27,	 '用户列表' ,    25
 --UNION ALL SELECT 28,	 '权限管理',     10
 with t AS (SELECT ROW_NUMBER() OVER(ORDER BY moduleid )id,*
  FROM test 
  WHERE ParentID=0
  UNION ALL 
 SELECT t.id,b.moduleid,b.modulename,b.parentid
 FROM t INNER JOIN test b ON t.ModuleID=b.ParentID)
 SELECT ModuleID ,ModuleName ,ParentID FROM t
 ORDER BY id,moduleid,parentid
 /*
 ModuleID    ModuleName ParentID
 ----------- ---------- -----------
 10          系统配置       0
 11          模块管理       10
 12          添加模块       11
 14          模块列表       11
 15          角色管理       10
 16          添加角色       15
 17          角色列表       15
 28          权限管理       10
 25          用户管理       0
 26          添加用户       25
 27          用户列表       25
 
 (11 行受影响)
 */

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧