ID      PID          name
1 0 江苏大学
2 0 清华大学
3 0 南京大学
4 1 工商学院
5 2 机械学院
6 3 工商学院
7 4 信息011
8 3 机械学院
9 0 东南大学
10 1 机械学院
11 4 统计012
12 2 能动学院
13 12 能源011
14 9 新节点
15 9 新节点2
16 14 新节点3
17 16 新节点4
18 17 新节点5
19 0 复旦大学
20 19 网院
21 19 继续教育id是PID的父项,比如说江苏大学ID是1,工商学院和机械学院隶属于江苏大学,统计学院是属于工商学院,以此类推
想知道SQL如何写?
select 大学,院系,专业 

解决方案 »

  1.   

    楼主的例子有错误.
    create table dx(ID int,PID int,name nvarchar(10))
    insert into dx select 1,0,'江苏大学'
    insert into dx select 2,0,'清华大学'
    insert into dx select 3,0,'南京大学'
    insert into dx select 4,1,'工商学院'
    insert into dx select 5,2,'机械学院'
    insert into dx select 6,3,'工商学院'
    insert into dx select 7,4,'信息011'
    insert into dx select 8,3,'机械学院'
    insert into dx select 9,0,'东南大学'
    insert into dx select 10,1,'机械学院'
    insert into dx select 11,4,'统计012'
    insert into dx select 12,2,'能动学院'
    insert into dx select 13,12,'能源011'
    insert into dx select 14,9,'新节点'
    insert into dx select 15,9,'新节点2'
    insert into dx select 16,14,'新节点3'
    insert into dx select 17,16,'新节点4'
    insert into dx select 18,17,'新节点5'
    insert into dx select 19,0,'复旦大学'
    insert into dx select 20,19,'网院'
    insert into dx select 21,19,'继续教育'
    go
    select count(*) from dx
    ;with cte as(
    select id,pid,name as 大学,convert(varchar(10),'') as 院系,convert(varchar(10),'') as 专业 from dx where pid=0
    union all 
    select b.id,b.pid,a.大学,convert(varchar(10),b.name),'' from cte a inner join dx b on a.id=b.pid and a.院系=''
    union all
    select b.id,b.pid,a.大学,a.院系,convert(varchar(10),b.name) from cte a inner join dx b on a.id=b.pid and a.院系!='' and a.专业=''
    )select 大学,院系,专业 from cte
    /*
    大学         院系         专业
    ---------- ---------- ----------
    江苏大学                  
    清华大学                  
    南京大学                  
    东南大学                  
    复旦大学                  
    复旦大学       网院         
    复旦大学       继续教育       
    东南大学       新节点        
    东南大学       新节点2       
    东南大学       新节点        新节点3
    南京大学       工商学院       
    南京大学       机械学院       
    清华大学       机械学院       
    清华大学       能动学院       
    清华大学       能动学院       能源011
    江苏大学       工商学院       
    江苏大学       机械学院       
    江苏大学       工商学院       信息011
    江苏大学       工商学院       统计012(19 行受影响)*/
    go
    drop table dx
      

  2.   

    BOM按节点排序应用实例 
    ----------------------------------------------------------------------------  Author : htl258(Tony)--  Date   : 2010-04-23 02:37:28--  Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) --          Jul  9 2008 14:43:34 --          Copyright (c) 1988-2008 Microsoft Corporation--          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)--  Subject: BOM按节点排序应用实例-------------------------------------------------------------------------- --实例1:--> 生成测试数据表:tb IF NOT OBJECT_ID('[tb]') IS NULL    DROP TABLE [tb]GOCREATE TABLE [tb]([id] INT,[code] NVARCHAR(10),[pid] INT,[name] NVARCHAR(10))INSERT [tb]SELECT 1,'01',0,N'服装' UNION ALLSELECT 2,'01',1,N'男装' UNION ALLSELECT 3,'01',2,N'西装' UNION ALLSELECT 4,'01',3,N'全毛' UNION ALLSELECT 5,'02',3,N'化纤' UNION ALLSELECT 6,'02',2,N'休闲装' UNION ALLSELECT 7,'02',1,N'女装' UNION ALLSELECT 8,'01',7,N'套装' UNION ALLSELECT 9,'02',7,N'职业装' UNION ALLSELECT 10,'03',7,N'休闲装' UNION ALLSELECT 11,'04',7,N'西装' UNION ALLSELECT 12,'01',11,N'全毛' UNION ALLSELECT 13,'02',11,N'化纤' UNION ALLSELECT 14,'05',7,N'休闲装'GO--SELECT * FROM [tb] -->SQL查询如下: ;WITH T AS(    SELECT CAST(CODE AS VARCHAR(20)) AS CODE,*,        CAST(ID AS VARBINARY(MAX)) AS px     FROM tb AS A    WHERE NOT EXISTS(SELECT * FROM tb WHERE id=A.pid)    UNION ALL     SELECT CAST(B.CODE+A.CODE AS VARCHAR(20)),A.*,         CAST(B.px+CAST(A.ID AS VARBINARY) AS VARBINARY(MAX))        FROM tb AS A        JOIN T AS B           ON A.pid=B.id)SELECT Code,Name FROM T ORDER BY px/*Code                 Name-------------------- ----------01                   服装0101                 男装010101               西装01010101             全毛01010102             化纤010102               休闲装0102                 女装010201               套装010202               职业装010203               休闲装010204               西装01020401             全毛01020402             化纤010205               休闲装 (14 行受影响)*/ --实例2:--> 生成测试数据表:tbIF NOT OBJECT_ID('[tb]') IS NULL
        DROP TABLE [tb]
    GO
    CREATE TABLE [tb]([id] INT,[parentid] INT,[categoryname] NVARCHAR(10))
    INSERT [tb]
    SELECT 1,0,'test1' UNION ALL
    SELECT 2,0,'test2' UNION ALL
    SELECT 3,1,'test1.1' UNION ALL
    SELECT 4,2,'test2.1' UNION ALL
    SELECT 5,3,'test1.1.1' UNION ALL
    SELECT 6,1,'test1.2'
    GO
    --SELECT * FROM [tb]-->SQL查询如下:
    ;WITH T AS
    (
        SELECT *,CAST(ID AS VARBINARY(MAX)) AS px 
        FROM tb AS A
        WHERE NOT EXISTS(SELECT * FROM tb WHERE id=A.[parentid])
        UNION ALL 
        SELECT A.*,CAST(B.px+CAST(A.ID AS VARBINARY) AS VARBINARY(MAX))  
        FROM tb AS A
            JOIN T AS B
               ON A.[parentid]=B.id
    )
    SELECT [id],[parentid],[categoryname] FROM T 
    ORDER BY px
    /*
    id          parentid    categoryname
    ----------- ----------- ------------
    1           0           test1
    3           1           test1.1
    5           3           test1.1.1
    6           1           test1.2
    2           0           test2
    4           2           test2.1(6 行受影响)
    */本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2010/04/23/5518166.aspx