(转)SQL树形数据的处理1

来源:互联网 发布:淘宝店铺活动封面 编辑:程序博客网 时间:2024/05/22 01:58

sqlserver 2005 cte特性 递归公用表表达式显示层次目录

表数据在这里下载,看看效果图:

 完美树形结果效果图

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
DECLARE @lenINT    --获取源表的编码字段的最长长度,方便后面补充sid排序区别码。
SET @len = ( SELECT MAX(LEN(code))FROM dbo.ZlDept )
 
WITH stb([id],pid,[level],[sid])AS
(
SELECT Code,UpCode,0,CONVERT(varchar(8000),(RIGHT('000'+[code],@len)))
FROM dbo.ZlDept
WHERE UpCode='0106'
UNION ALL
SELECT a.[code],a.upcode,b.[level]+1,b.sid+','+RIGHT('000'+a.code,@len)
FROM dbo.ZlDept a,stb b
WHERE b.[id]=a.upCode
)
 
--- 完美带树形线标识的显示结果
SELECT 带树形标识的name =case
when b.[level]=0then a.name
when b.[level]=1then CASE id
                    WHEN (SELECT RIGHT(MAX(sid),MAX(LEN(id)))FROM stbWHERE pid=b.pid)THEN N'└' + REPLICATE('-',4) + a.name
                    ELSE N'├' + REPLICATE('-',4) + a.name
                    END
else REPLICATE(N'│'+REPLICATE('',(b.level-1)*4),b.[level]-1) + CASE id
                    WHEN (SELECT RIGHT(MAX(sid),MAX(LEN(id)))FROM stbWHERE pid=b.pid)THEN N'└' + REPLICATE('-',4) + a.name
                    ELSE N'├' + REPLICATE('-',4) + a.name
                    END
END--,b.id,b.pid,b.level,b.sid,a.name
FROM dbo.ZlDept a,stb b
WHERE b.[id]=a.Code
ORDER BY b.sid
 
/* 方案思路:
0、学习了邹建老大的案例http://blog.csdn.net/zjcxc/archive/2005/07/27/436328.aspx
1、理解使用了sqlserver2005新特性cte,递归公用表表达式显示层次目录
2、自添加关键的排序sid,列出树形层次结构与树形标识时多次用到,
树形标识中当同一级别level的编码与编码父编码结果集中最后(即最大)一个编码相同时可判定为同一父编码下的最后层次,用'└'显示,其他用'├'显示。
多层目录下用'│'连接。最好友好显示树状结果集。
*/

原创粉丝点击