--测试数据 DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10)) INSERT @t SELECT '001',NULL ,'山东省' UNION ALL SELECT '002','001','烟台市' UNION ALL SELECT '004','002','招远市' UNION ALL SELECT '003','001','青岛市' UNION ALL SELECT '005',NULL ,'四会市' UNION ALL SELECT '006','005','清远市' UNION ALL SELECT '007','006','小分市'--深度排序显示处理 --生成每个节点的编码累计(相同当单编号法的编码) DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000)) DECLARE @Level int SET @Level=0 INSERT @t_Level SELECT ID,@Level,ID FROM @t WHERE PID IS NULL WHILE @@ROWCOUNT>0 BEGIN SET @Level=@Level+1 INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID FROM @t a,@t_Level b WHERE a.PID=b.ID AND b.Level=@Level-1 END--显示结果 SELECT SPACE(b.Level*2)+'|--'+a.Name FROM @t a,@t_Level b WHERE a.ID=b.ID ORDER BY b.Sort /*--结果 |--山东省 |--烟台市 |--招远市 |--青岛市 |--四会市 |--清远市 |--小分市 --*/
select [MODULE_NAME] from ( select [MODULE_NAME],ltrim([MODULE_ID]) as ord from @T where [SUPMODULE_ID]=0 union all select [MODULE_NAME],ltrim([SUPMODULE_ID])+ltrim([MODULE_ID]) from @T where [SUPMODULE_ID]<>0 ) a order by ord
用SQL05的CTE --> -->
if not object_id('Tempdb..#T') is null drop table #T Go Create table #T([MODULE_ID] int,[MODULE_NAME] nvarchar(6),[SUPMODULE_ID] int) Insert #T select 1,N'权限管理',0 union all select 2,N'角色管理',1 union all select 3,N'财务管理',0 union all select 4,N'日常开销管理',3 Go ;with cte as (Select *,cast(right(100+[MODULE_ID],2) as nvarchar(100) ) as path1 from #T where [SUPMODULE_ID]=0 union all select t.*,cast(c.path1+right(100+t.[MODULE_ID],2) as nvarchar(100)) as path1 from #T t inner join cte c on t.[SUPMODULE_ID]=c.[MODULE_ID] ) select * from cte order by Path1 option( MAXRECURSION 0) 4 個資料列受到影響) MODULE_ID MODULE_NAME SUPMODULE_ID path1 ----------- ----------- ------------ ---------------------------------------------------------------------------------------------------- 1 权限管理 0 01 2 角色管理 1 0102 3 财务管理 0 03 4 日常开销管理 3 0304(4 個資料列受到影響)
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END--显示结果
SELECT SPACE(b.Level*2)+'|--'+a.Name
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
|--山东省
|--烟台市
|--招远市
|--青岛市
|--四会市
|--清远市
|--小分市
--*/
(
select [MODULE_NAME],ltrim([MODULE_ID]) as ord from @T where [SUPMODULE_ID]=0
union all
select [MODULE_NAME],ltrim([SUPMODULE_ID])+ltrim([MODULE_ID]) from @T where [SUPMODULE_ID]<>0
) a
order by ord
--> -->
if not object_id('Tempdb..#T') is null
drop table #T
Go
Create table #T([MODULE_ID] int,[MODULE_NAME] nvarchar(6),[SUPMODULE_ID] int)
Insert #T
select 1,N'权限管理',0 union all
select 2,N'角色管理',1 union all
select 3,N'财务管理',0 union all
select 4,N'日常开销管理',3
Go
;with cte as
(Select *,cast(right(100+[MODULE_ID],2) as nvarchar(100) ) as path1 from #T where [SUPMODULE_ID]=0
union all
select t.*,cast(c.path1+right(100+t.[MODULE_ID],2) as nvarchar(100)) as path1 from #T t inner join cte c on t.[SUPMODULE_ID]=c.[MODULE_ID] )
select * from cte order by Path1 option( MAXRECURSION 0)
4 個資料列受到影響)
MODULE_ID MODULE_NAME SUPMODULE_ID path1
----------- ----------- ------------ ----------------------------------------------------------------------------------------------------
1 权限管理 0 01
2 角色管理 1 0102
3 财务管理 0 03
4 日常开销管理 3 0304(4 個資料列受到影響)