比如:id name parentid brotherid level
1 广东省  0       1         1
2 广州市  1       1         2
3 越秀区  2       1         3
4 应元路  3       1         4        
5 天河区  2       2         3
6 深圳市  1       2         2
7 福田区  6       1         3
8 罗湖区  6       2         3
9 珠海市  1       3         2
10 新地区 2       3         3
11 新的地区 2     4         3我想要先按parentid再同一级别按brotherid排,效果如下:
1 广东省  0       1
2 广州市  1       1
3 越秀区  2       1
4 应元路  3       1
5 天河区  2       2
10 新地区 2       3
11 新的地区 2     4
9 珠海市  1       3
6 深圳市  1       2
7 福田区  6       1
8 罗湖区  6       2就像树的节点一样,依次排下下去。。请问改怎么写??

解决方案 »

  1.   

    参考,应该够用
    http://blog.csdn.net/xys_777/archive/2010/06/15/5672481.aspx
      

  2.   

    ----------------------------------------------------------------------------------
    -- Author : htl258(Tony)
    -- Date   : 2010-06-21 11:10:56
    -- 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 2)
    -- Blog   : http://blog.csdn.net/htl258
    ------------------------------------------------------------------------------------> 生成测试数据表: [tb]
    IF OBJECT_ID('[tb]') IS NOT NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE [tb] ([id] [int],[name] [nvarchar](10),[parentid] [int],[brotherid] [int],[level] [int])
    INSERT INTO [tb]
    SELECT '1','广东省','0','1','1' UNION ALL
    SELECT '2','广州市','1','1','2' UNION ALL
    SELECT '3','越秀区','2','1','3' UNION ALL
    SELECT '4','应元路','3','1','4' UNION ALL
    SELECT '5','天河区','2','2','3' UNION ALL
    SELECT '6','深圳市','1','2','2' UNION ALL
    SELECT '7','福田区','6','1','3' UNION ALL
    SELECT '8','罗湖区','6','2','3' UNION ALL
    SELECT '9','珠海市','1','3','2' UNION ALL
    SELECT '10','新地区','2','3','3' UNION ALL
    SELECT '11','新的地区','2','4','3'--SELECT * FROM [tb]-->SQL查询如下:;WITH t AS 
    (
    SELECT *,px=CAST(id AS VARBINARY) FROM tb WHERE parentid=0
    UNION ALL
    SELECT a.*,CAST(px+CAST(a.id AS VARBINARY) AS VARBINARY)
    FROM tb a 
    JOIN t b
    ON a.parentid=b.id
    )
    SELECT id,NAME,parentid,brotherid,LEVEL 
    FROM t 
    ORDER BY px
    /*
    id          NAME       parentid    brotherid   LEVEL
    ----------- ---------- ----------- ----------- -----------
    1           广东省        0           1           1
    2           广州市        1           1           2
    3           越秀区        2           1           3
    4           应元路        3           1           4
    5           天河区        2           2           3
    10          新地区        2           3           3
    11          新的地区       2           4           3
    6           深圳市        1           2           2
    7           福田区        6           1           3
    8           罗湖区        6           2           3
    9           珠海市        1           3           2(11 行受影响)
    */
      

  3.   

    ;WITH t AS 
    (
    SELECT *,px=CAST(id AS VARBINARY),lvl=0 FROM tb WHERE parentid=0
    UNION ALL
    SELECT a.*,CAST(px+CAST(a.id AS VARBINARY) AS VARBINARY),lvl+1
    FROM tb a 
    JOIN t b
    ON a.parentid=b.id
    )
    SELECT REPLICATE('.',lvl)+LTRIM(id) ID,NAME,parentid,brotherid,LEVEL 
    FROM t 
    ORDER BY px
    /*
    ID         NAME       parentid    brotherid   LEVEL
    ---------- ---------- ----------- ----------- -----------
    1          广东省        0           1           1
    .2         广州市        1           1           2
    ..3        越秀区        2           1           3
    ...4       应元路        3           1           4
    ..5        天河区        2           2           3
    ..10       新地区        2           3           3
    ..11       新的地区       2           4           3
    .6         深圳市        1           2           2
    ..7        福田区        6           1           3
    ..8        罗湖区        6           2           3
    .9         珠海市        1           3           2(11 行受影响)
    */这样看比较清楚
      

  4.   


    use Tempdb
    go
    --> --> 
    if not object_id(N'T') is null
    drop table T
    Go
    Create table T([id] int,[name] nvarchar(10),[parentid] int,[brotherid] int,[level] int)
    Insert T
    select 1,N'广东省',0,1,1 union all
    select 2,N'广州市',1,1,2 union all
    select 3,N'越秀区',2,1,3 union all
    select 4,N'应元路',3,1,4 union all
    select 5,N'天河区',2,2,3 union all
    select 6,N'深圳市',1,2,2 union all
    select 7,N'福田区',6,1,3 union all
    select 8,N'罗湖区',6,2,3 union all
    select 9,N'珠海市',1,3,2 union all
    select 10,N'新地区',2,3,3 union all
    select 11,N'新的地区',2,4,3
    Go
    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 [parentid]=0
    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.[parentid]=b.ID
    AND b.Level=@Level-1
    ORDER BY ID
    ENDSELECT a.*
    FROM T a,@t_Level b
    WHERE a.ID=b.ID
    ORDER BY CAST(b.Sort AS INT)
    id          name       parentid    brotherid   level
    ----------- ---------- ----------- ----------- -----------
    1           广东省        0           1           1
    2           广州市        1           1           2
    3           越秀区        2           1           3
    6           深圳市        1           2           2
    5           天河区        2           2           3
    9           珠海市        1           3           2
    4           应元路        3           1           4
    10          新地区        2           3           3
    11          新的地区       2           4           3
    7           福田区        6           1           3
    8           罗湖区        6           2           3(11 個資料列受到影響)
      

  5.   

    本帖最后由 roy_88 于 2010-06-21 11:29:26 编辑
      

  6.   

    5楼的方法可以用,但是排序出来的顺序有问题3楼的方法排序出来的顺序是我想要的,但是我的数据库是2000,不支持啊。
    ;WITH t AS 
    (
        SELECT *,px=CAST(id AS VARBINARY),lvl=0 FROM tb WHERE parentid=0
        UNION ALL
        SELECT a.*,CAST(px+CAST(a.id AS VARBINARY) AS VARBINARY),lvl+1
        FROM tb a 
            JOIN t b
                ON a.parentid=b.id
    )
    SELECT REPLICATE('.',lvl)+LTRIM(id) ID,NAME,parentid,brotherid,LEVEL 
    FROM t 
    ORDER BY px
    /*
    ID         NAME       parentid    brotherid   LEVEL
    ---------- ---------- ----------- ----------- -----------
    1          广东省        0           1           1
    .2         广州市        1           1           2
    ..3        越秀区        2           1           3
    ...4       应元路        3           1           4
    ..5        天河区        2           2           3
    ..10       新地区        2           3           3
    ..11       新的地区       2           4           3
    .6         深圳市        1           2           2
    ..7        福田区        6           1           3
    ..8        罗湖区        6           2           3
    .9         珠海市        1           3           2大家再帮我看看吧
      

  7.   

    ----------------------------------------------------------------------------------
    -- Author : htl258(Tony)
    -- Date   : 2010-06-21 11:10:56
    -- 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 2)
    -- Blog   : http://blog.csdn.net/htl258
    ------------------------------------------------------------------------------------> 生成测试数据表: [tb]
    IF OBJECT_ID('[tb]') IS NOT NULL
        DROP TABLE [tb]
    GO
    CREATE TABLE [tb] ([id] [int],[name] [nvarchar](10),[parentid] [int],[brotherid] [int],[level] [int])
    INSERT INTO [tb]
    SELECT '1','广东省','0','1','1' UNION ALL
    SELECT '2','广州市','1','1','2' UNION ALL
    SELECT '3','越秀区','2','1','3' UNION ALL
    SELECT '4','应元路','3','1','4' UNION ALL
    SELECT '5','天河区','2','2','3' UNION ALL
    SELECT '6','深圳市','1','2','2' UNION ALL
    SELECT '7','福田区','6','1','3' UNION ALL
    SELECT '8','罗湖区','6','2','3' UNION ALL
    SELECT '9','珠海市','1','3','2' UNION ALL
    SELECT '10','新地区','2','3','3' UNION ALL
    SELECT '11','新的地区','2','4','3'--SELECT * FROM [tb]
    DECLARE @t_Level TABLE(ID char(3),Level int,Sort VARBINARY(8000))
    DECLARE @Level int
    SET @Level=0
    INSERT @t_Level SELECT ID,@Level,cast(ID AS VARBINARY)
    FROM Tb
    WHERE [parentid]=0
    WHILE @@ROWCOUNT>0
    BEGIN
        SET @Level=@Level+1
        INSERT @t_Level SELECT a.ID,@Level,b.Sort+cast(a.ID AS VARBINARY)
        FROM Tb a,@t_Level b
        WHERE a.[parentid]=b.ID
            AND b.Level=@Level-1
        ORDER BY ID
    ENDSELECT pxid=cast(replicate('.',b.Level)+LTRIM(a.id) AS VARCHAR),a.*
    FROM Tb a,@t_Level b
    WHERE a.ID=b.ID
    ORDER BY b.Sort 
    /*
    pxid                           id          name       parentid    brotherid   level
    ------------------------------ ----------- ---------- ----------- ----------- -----------
    1                              1           广东省        0           1           1
    .2                             2           广州市        1           1           2
    ..3                            3           越秀区        2           1           3
    ...4                           4           应元路        3           1           4
    ..5                            5           天河区        2           2           3
    ..10                           10          新地区        2           3           3
    ..11                           11          新的地区       2           4           3
    .6                             6           深圳市        1           2           2
    ..7                            7           福田区        6           1           3
    ..8                            8           罗湖区        6           2           3
    .9                             9           珠海市        1           3           2(11 行受影响)
    */