数据库管理与开发 阶梯

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

表数据在这里下载,看看效果图:
 完美树形结果效果图

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

/* 方案思路:
0、学习了邹建老大的案例 http://blog.csdn.net/zjcxc/archive/2005/07/27/436328.aspx
1、理解使用了sqlserver2005新特性cte,递归公用表表达式显示层次目录
2、自添加关键的排序sid,列出树形层次结构与树形标识时多次用到,
树形标识中当同一级别level的编码与编码父编码结果集中最后(即最大)一个编码相同时可判定为同一父编码下的最后层次,用'└'显示,其他用'├'显示。
多层目录下用'│'连接。最好友好显示树状结果集。
*/

 

posted on 2010-05-15 11:28  zhou__zhou  阅读(1332)  评论(0编辑  收藏  举报