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
的编码与编码父编码结果集中最后(即最大)一个编码相同时可判定为同一父编码下的最后层次,用
'└'
显示,其他用
'├'
显示。
多层目录下用
'│'
连接。最好友好显示树状结果集。
*/
|