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

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  @len INT     --获取源表的编码字段的最长长度,方便后面补充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 ]=0 then  a. name
when  b.[ level ]=1 then  CASE  id
                     WHEN  ( SELECT  RIGHT ( MAX (sid), MAX (LEN(id))) FROM  stb WHERE  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  stb WHERE  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
 
/* 方案思路:
1、理解使用了sqlserver2005新特性cte,递归公用表表达式显示层次目录
2、自添加关键的排序sid,列出树形层次结构与树形标识时多次用到,
树形标识中当同一级别 level 的编码与编码父编码结果集中最后(即最大)一个编码相同时可判定为同一父编码下的最后层次,用 '└' 显示,其他用 '├' 显示。
多层目录下用 '│' 连接。最好友好显示树状结果集。
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值