从数据库中查询出来的结果,下面的地址,我做了个表格
http://www.csscn.cn/list.html我简直是无从下手啊.....老师们给个思路.怕上面的连接打不开,我复制下结果
Child NodeName NodeID ParentID RootID arrChildID PrevID NextID OrderID
0 首页 -2 0 0 -2 0 0 0
10 文章中心 1 0 1 1,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 0 2 0
0 图片中心 2 0 2 2 1 3 0
0 下载中心 3 0 3 3 2 4 0
0 公告 5 0 5 5 4 6 0
0 友情链接 6 0 6 6 5 7 0
0 雁过留声 7 0 7 7 6 8 0
0 版权信息 8 0 8 8 7 26 0
2 虚空之惠 9 1 1 9,17,18,19,20,21,22,25 0 10 1
0 一念之间 10 1 1 10 9 11 9
0 死亡错觉 11 1 1 11 10 12 10
0 多愁善感 12 1 1 12 11 13 11
0 五彩缤纷 13 1 1 13 12 14 12
0 集思广益 14 1 1 14 13 15 13
0 心思力竭 15 1 1 15 14 16 14
0 堕落眷顾 16 1 1 16 15 23 15
2 绝对静默 17 9 1 17,19,20,25 0 18 2
2 凡尘宿命 18 9 1 18,21,22 17 10 6
1 一心向善 19 17 1 19,25 0 20 3
0 森林之风 20 17 1 20 19 18 5
0 浮想联翩 21 18 1 21 0 22 7
0 暗影光辉 22 18 1 22 21 10 8
0 圣手平息 23 1 1 23 16 24 16
0 挥霍生命 24 1 1 24 23 2 17
0 永恒痛苦 25 19 1 25 0 20 4
0 新闻资讯 26 0 9 26 8 0 0
解决方案 »
- 数据不小心用DELETE给清空了,请教怎么恢复
- 分组并更新组内的信息,帮忙思考一下______thank you
- sql server如何建立远程连接?
- MSSQLServer事件问题!
- 请问若要定义长度为10 的整数,用什么类型比较好?能decimal(10,0)吗??
- 那位高人告诉我与Foxbase的total on 的SQL语句怎样写?
- select * from news where shijian like '2001-2-2125'
- 非常奇怪的错误信息,有谁能帮助我啊。网上找不到相关的信息关于dbo.mdb
- 快来!!!
- vc++调用SQL SERVER存储过程疑难问题,100分赠送。
- 求一SQL语句
- 帮忙看看这是什么原因?
NewDataSet
|-Table[repet:26]
| |-NodeID
| |-Depth
| |-ParentID
| |-RootID
| |-Child
| |-arrChildID
| |-NodeName
把Depth加进去了,而且表格做了样式,看的更加清晰一些.
if object_id('tempdb.dbo.#T') is not null drop table #T
create table #T (NodeID int,Depth int,ParentID int,RootID int,Child int,arrChildID varchar(51),NodeName varchar(8),ParentPath varchar(11),PrevID int,NextID int,OrderID int)
insert into #T
select -2,0,0,0,0,'-2','首页','0',0,0,0 union all
select 1,0,0,1,10,'1,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25','文章中心','0',0,2,0 union all
select 2,0,0,2,0,'2','图片中心','0',1,3,0 union all
select 3,0,0,3,0,'3','下载中心','0',2,4,0 union all
select 5,0,0,5,0,'5','公告','0',4,6,0 union all
select 6,0,0,6,0,'6','友情链接','0',5,7,0 union all
select 7,0,0,7,0,'7','雁过留声','0',6,8,0 union all
select 8,0,0,8,0,'8','版权信息','0',7,26,0 union all
select 26,0,0,9,0,'26','新闻资讯','0',8,0,0 union all
select 9,1,1,1,2,'9,17,18,19,20,21,22,25','虚空之惠','0,1',0,10,1 union all
select 10,1,1,1,0,'10','一念之间','0,1',9,11,9 union all
select 11,1,1,1,0,'11','死亡错觉','0,1',10,12,10 union all
select 12,1,1,1,0,'12','多愁善感','0,1',11,13,11 union all
select 13,1,1,1,0,'13','五彩缤纷','0,1',12,14,12 union all
select 14,1,1,1,0,'14','集思广益','0,1',13,15,13 union all
select 15,1,1,1,0,'15','心思力竭','0,1',14,16,14 union all
select 16,1,1,1,0,'16','堕落眷顾','0,1',15,23,15 union all
select 23,1,1,1,0,'23','圣手平息','0,1',16,24,16 union all
select 24,1,1,1,0,'24','挥霍生命','0,1',23,2,17 union all
select 17,2,9,1,2,'17,19,20,25','绝对静默','0,1,9',0,18,2 union all
select 18,2,9,1,2,'18,21,22','凡尘宿命','0,1,9',17,10,6 union all
select 19,3,17,1,1,'19,25','一心向善','0,1,9,17',0,20,3 union all
select 20,3,17,1,0,'20','森林之风','0,1,9,17',19,18,5 union all
select 21,3,18,1,0,'21','浮想联翩','0,1,9,18',0,22,7 union all
select 22,3,18,1,0,'22','暗影光辉','0,1,9,18',21,10,8 union all
select 25,4,19,1,0,'25','永恒痛苦','0,1,9,17,19',0,20,4
;
with
T1 (ID,P1,P2) as
(
select NodeID,charindex(',',','+arrChildID),charindex(',',arrChildID+',')+1 from #T
union all
select a.NodeID,b.P2,charindex(',',arrChildID+',',b.P2)+1 from #T a join T1 b on a.NodeID=b.ID where charindex(',',arrChildID+',',b.P2)>0
),
T2 (ID, ChildID) as
(
select a.NodeID,arrChildID=substring(a.arrChildID+',',b.P1,b.P2-b.P1-1) from #T a join T1 b on a.NodeID=b.ID
),
T3 (ID, ParentID) as
(
select cast(ChildID as int),case ChildID when '-2' then null else -2 end from T2 t where not exists (select 1 from T2 where ChildID=t.ChildID and ID<>t.ID)
union all
select cast(ChildID as int),max(ID) from T2 where ID<>ChildID group by ChildID
)
select a.*,b.NodeName,b.Depth from T3 a join #T b on a.ID=b.NodeID order by 2,1
/*
ID ParentID NodeName Depth
----------- ----------- ------------ -----------
-2 NULL 首页 0
1 -2 文章中心 0
2 -2 图片中心 0
3 -2 下载中心 0
5 -2 公告 0
6 -2 友情链接 0
7 -2 雁过留声 0
8 -2 版权信息 0
26 -2 新闻资讯 0
9 1 虚空之惠 1
10 1 一念之间 1
11 1 死亡错觉 1
12 1 多愁善感 1
13 1 五彩缤纷 1
14 1 集思广益 1
15 1 心思力竭 1
16 1 堕落眷顾 1
23 1 圣手平息 1
24 1 挥霍生命 1
17 9 绝对静默 2
18 9 凡尘宿命 2
19 17 一心向善 3
20 17 森林之风 3
21 18 浮想联翩 3
22 18 暗影光辉 3
25 19 永恒痛苦 4
*/
先找到第一级,然后循环本级找出下一级...一般来是,大多数开发语言都有tree(或treelist)控件.
--测试数据
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
/*--结果
|--山东省
|--烟台市
|--招远市
|--青岛市
|--四会市
|--清远市
|--小分市
--*/
--树形数据广度排序处理示例.
--测试数据
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)
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END--显示结果
SELECT a.*
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Level,b.ID
/*--结果
ID PID Name
------- --------- ----------
001 NULL 山东省
005 NULL 四会市
002 001 烟台市
003 001 青岛市
006 005 清远市
004 002 招远市
007 006 小分市
--*/
-- 树形数据深度排序处理示例(递归法)
--测试数据
CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
INSERT tb 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','小分市'
GO--广度搜索排序函数
CREATE FUNCTION f_Sort(@ID char(3)=NULL,@sort int=1)
RETURNS @t_Level TABLE(ID char(3),sort int)
AS
BEGIN
DECLARE tb CURSOR LOCAL
FOR
SELECT ID FROM tb
WHERE PID=@ID
OR(@ID IS NULL AND PID IS NULL)
OPEN TB
FETCH tb INTO @ID
WHILE @@FETCH_STATUS=0
BEGIN
INSERT @t_Level VALUES(@ID,@sort)
SET @sort=@sort+1
IF @@NESTLEVEL<32 --如果递归层数未超过32层(递归最大允许32层)
BEGIN
--递归查找当前节点的子节点
INSERT @t_Level SELECT * FROM f_Sort(@ID,@sort)
SET @sort=@sort+@@ROWCOUNT --排序号加上子节点个数
END
FETCH tb INTO @ID
END
RETURN
END
GO--显示结果
SELECT a.*
FROM tb a,f_Sort(DEFAULT,DEFAULT) b
WHERE a.ID=b.ID
ORDER BY b.sort
/*--结果
ID PID Name
------ --------- ----------
001 NULL 山东省
002 001 烟台市
004 002 招远市
003 001 青岛市
005 NULL 四会市
006 005 清远市
007 006 小分市
--*/