从数据库中查询出来的结果,下面的地址,我做了个表格
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 

解决方案 »

  1.   

    本来想用XSLT实现到构架下又不知道怎么下手,郁闷了啊.
    NewDataSet
    |-Table[repet:26]
    |  |-NodeID
    |  |-Depth
    |  |-ParentID
    |  |-RootID
    |  |-Child
    |  |-arrChildID
    |  |-NodeName
      

  2.   

    还有一个 Depth字段 节点树的深度,根节点的值为0,子节点的值为该节点所在的层数 我每帖出来可能有用.
      

  3.   

    我更新了下这个地址 http://www.csscn.cn/list.html
    把Depth加进去了,而且表格做了样式,看的更加清晰一些.
      

  4.   

    --> 测试数据: #T
    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
    */
      

  5.   

    这个不是SQL能完成的.一般来说,你需要的结果是在软件开发中通过编写代码来实现.
    先找到第一级,然后循环本级找出下一级...一般来是,大多数开发语言都有tree(或treelist)控件.
      

  6.   

    如果只要数据格式参考如下:-- 树形数据层次显示处理示例
    --测试数据
    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   小分市
    --*/
      

  7.   

    啊,楼上说的对.SQL是无法完成的..总之谢谢各位了.@Limpire 特别感谢你!.
      

  8.   

    拿到结果集你在代码中遍历TREE就是了