本人很菜,万不得已来论坛提问了。要求如下:
    有5级关系。即第1级的下属单位是第2级 第2级下属单位是第3级 第3级的下属单位是第4级 以此类推。    也就是说第5级单位属于第4,3,2,1级       第4级单位属于第3,2,1级  以此类推    其中有很多第1级单位(这些1级单位的下属单位同上)     这些第1级单位他们的等级是平行的
关系大家屡屡 应该明白了吧。现在有一个表里    有很多这样的单位        排序杂乱的需要通过SQL语句        来进行排序      使其显示顺序是第1级单位然后第2级....第5级      然后下一行又是另一个第1级单位....第5级单位        以此类推求高人

解决方案 »

  1.   

    --这个意思?
    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
      

  2.   

    还是这个"
    --参考一下实例
    --> 生成测试数据表:tb
    IF NOT OBJECT_ID('[tb]') IS NULL
     DROP TABLE [tb]
    GO
    CREATE TABLE [tb](GUID INT IDENTITY,[col1] NVARCHAR(10),[col2] NVARCHAR(20))
    INSERT [tb]
    SELECT N'A','01' UNION ALL
    SELECT N'B','01.01' UNION ALL
    SELECT N'C','01.01.01' UNION ALL
    SELECT N'F','01.01.01.01' UNION ALL
    SELECT N'E','01.01.01.02' UNION ALL
    SELECT N'D','01.01.01.03' UNION ALL
    SELECT N'O','02' UNION ALL
    SELECT N'P','02.01' UNION ALL
    SELECT N'Q','02.01.01' 
    GO
    --SELECT * FROM [tb]-->SQL查询如下:---另一种方法
    ;WITH T AS
    (
       SELECT *,PATH=CAST([COL1] AS VARCHAR(1000)) FROM TB A
           WHERE NOT EXISTS(
            SELECT 1 FROM TB 
         WHERE A.COL2 LIKE COL2+'%' 
       AND LEN(A.COL2)>LEN(COL2))
       UNION ALL
       SELECT A.*,CAST(PATH+'-->'+A.COL1 AS VARCHAR(1000))
       FROM TB A 
       JOIN T B 
            ON A.COL2 LIKE B.COL2+'%'            AND LEN(A.COL2)-3=LEN(B.COL2)
    )SELECT * FROM T ORDER BY LEFT(COL2,2)/*GUID        COL1        COL2                  PATH----------- ---------- -------------------- --------------------1           A          01                   A2           B          01.01                A-->B3           C          01.01.01             A-->B-->C4           F          01.01.01.01          A-->B-->C-->F5           E          01.01.01.02          A-->B-->C-->E6           D          01.01.01.03          A-->B-->C-->D7           O          02                   O8           P          02.01                O-->P9           Q          02.01.01             O-->P-->Q
    (9 行受影响)*/
    ;WITH T AS(
        SELECT *,CAST(COL1  AS VARCHAR(1000)) AS PATH
        FROM  TB 
        WHERE COL2 NOT LIKE '%.%'
        UNION ALL
        SELECT A.*,CAST(B.PATH+'-->'+A.COL1 AS VARCHAR(1000))
        FROM TB A,T B
        WHERE A.COL2 LIKE B.COL2+'.[01-99][01-99]'
    )SELECT * FROM T 
    ORDER BY LEFT(COL2,2)/*GUID        COL1        COL2                  PATH----------- ---------- -------------------- --------------------1           A          01                   A2           B          01.01                A-->B3           C          01.01.01             A-->B-->C4           F          01.01.01.01          A-->B-->C-->F5           E          01.01.01.02          A-->B-->C-->E6           D          01.01.01.03          A-->B-->C-->D7           O          02                   O8           P          02.01                O-->P9           Q          02.01.01             O-->P-->Q (9 行受影响)*/