各位大侠,小弟有个难题需要各位指导一二。
我想要通过一张基础表,如下
ID Name ParentID
1 英语 0
2 生物 0
3 计算机 0
4 口语 1
5 听力 1
6 数据库 3
7 软件工程 3
8 SQL Server 6
9 Oracle 6
10 李阳口语 4
11 李阳听力 5
12 李阳口语365句 10
… … …
… … …得到想要的结果表如下,ID Name name name name name
12 李阳口语365句 英语 口语 李阳口语 李阳口语365句
11 李阳听力 英语 听力 李阳听力
8 SQL Server 计算机 数据库 实际应该是一个N级递归的问题,请问我该如何写啊,谢谢

解决方案 »

  1.   

    乱,请参考
    SQL Server 中树形表数据的处理总结 
    http://blog.csdn.net/xys_777/archive/2010/06/15/5672481.aspx
    后面有例子
      

  2.   

    ID Name ParentID
    1 英语        0
    2 生物        0
    3 计算机      0
    4 口语        1
    5 听力        1
    6 数据库      3
    7 软件工程    3
    8 SQL Server 6
    9 Oracle     6
    10 李阳口语   4
    11 李阳听力   5
    12 李阳口语365句 10
    … … …
    … … …
    不好意思,我的错,最后的结果写的有问题,应该是这样的,
    ID  Name          name  name   name 
    12  李阳口语365句   英语   口语   李阳口语
    11  李阳听力        英语   听力
    8   SQL Server    计算机 数据库 
    ..
      

  3.   

    --> 生成测试数据表: [tb]
    IF OBJECT_ID('[tb]') IS NOT NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE [tb] ([ID] [int],[Name] [nvarchar](20),[ParentID] [int])
    INSERT INTO [tb]
    SELECT '1','英语','0' UNION ALL
    SELECT '2','生物','0' UNION ALL
    SELECT '3','计算机','0' UNION ALL
    SELECT '4','口语','1' UNION ALL
    SELECT '5','听力','1' UNION ALL
    SELECT '6','数据库','3' UNION ALL
    SELECT '7','软件工程','3' UNION ALL
    SELECT '8','SQL Server','6' UNION ALL
    SELECT '9','Oracle','6' UNION ALL
    SELECT '10','李阳口语','4' UNION ALL
    SELECT '11','李阳听力','5' UNION ALL
    SELECT '12','李阳口语365句','10'--SELECT * FROM [tb]-->SQL查询如下:
    ;WITH t AS 
    (
    SELECT Name1 = Name,ID1=ID, * 
    FROM tb t
    WHERE NOT EXISTS(
              SELECT 1 
              FROM tb
              WHERE ParentID = t.ID
          )
    UNION ALL
    SELECT b.Name1,ID1,a.* 
    FROM tb a
    JOIN t b
    ON  a.ID = b.ParentID
    ),
    t1 AS
    (
    SELECT rn=ROW_NUMBER()OVER(PARTITION BY Name1 ORDER BY ID),ID1,Name1,Name 
    FROM t
    WHERE name<>name1
    )
    SELECT ID=ID1,Name1,Name2=[1],Name3=[2],Name4=[3]
    FROM t1 
    PIVOT(MAX(Name) FOR rn IN([1],[2],[3])) b
    ORDER BY 1 DESC
    /*
    ID          Name1                Name2                Name3                Name4
    ----------- -------------------- -------------------- -------------------- --------------------
    12          李阳口语365句             英语                   口语                   李阳口语
    11          李阳听力                 英语                   听力                   NULL
    9           Oracle               计算机                  数据库                  NULL
    8           SQL Server           计算机                  数据库                  NULL
    7           软件工程                 计算机                  NULL                 NULL(5 行受影响)
    */先看一下这个效果是不是你要的。
      

  4.   

    本帖最后由 htl258 于 2010-07-06 13:18:18 编辑