id  name  type  parent
1  广东   1      0
2  江西   1      0
3  赣州   2      2
4  广州   2      1
5  天河   3      4
6  赣县   3      3
7  佛山   2      1
8  南昌   2      2
9  高明   3      7
10 昌县   3      8
11 深圳   2      1
排序结果要求:
id  name  type  parent
1  广东   1      0
4  广州   2      1
5  天河   3      4
7  佛山   2      1
9  高明   3      7
11 深圳   2      1
2  江西   1      0
3  赣州   2      2
6  赣县   3      3
8  南昌   2      2
10 昌县   3      8

解决方案 »

  1.   


    select * from @tb  order by (id+1)%2 
      

  2.   


    --测试数据
    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
    /*--结果
    |--山东省
      |--烟台市
        |--招远市
      |--青岛市
    |--四会市
      |--清远市
        |--小分市
    --*/
      

  3.   


    /*
    标题:查询所有顶级节点及其子节点的例
    地址:http://topic.csdn.net/u/20090323/21/63a91f51-c4df-464d-ba18-64343deb4e3a.html
    作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
    时间:2009-03-23
    地点:广东深圳
    */[code=SQL]create table Area (id int identity,Name varchar(10) ,order_by int ,father_ID int )
    insert into area values('广东省',2,0) 
    insert into area values('四川省',2,0) 
    insert into area values('湖北省',2,0) 
    insert into area values('东莞市',1,1) 
    insert into area values('广州市',1,1) 
    insert into area values('天河区',0,5) 
    insert into area values('绵阳市',1,2) 
    insert into area values('武汉市',1,3) 
    insert into area values('汉口区',0,8) 
    insert into area values('随州市',1,3)
    goselect * from areadrop table area/*
    id          Name       order_by    father_ID   
    ----------- ---------- ----------- ----------- 
    1           广东省        2           0
    2           四川省        2           0
    3           湖北省        2           0
    4           东莞市        1           1
    5           广州市        1           1
    6           天河区        0           5
    7           绵阳市        1           2
    8           武汉市        1           3
    9           汉口区        0           8
    10          随州市        1           3(所影响的行数为 10 行)要求显示为:
    name           
    -------------- 
    广东省
      东莞市
      广州市
        天河区
    四川省
      绵阳市
    湖北省
      武汉市
        汉口区
      随州市(所影响的行数为 10 行)
    */
    --创建原始表
    create table Area (id int identity,Name varchar(10) ,order_by int ,father_ID int )
    insert into area values('广东省',2,0) 
    insert into area values('四川省',2,0) 
    insert into area values('湖北省',2,0) 
    insert into area values('东莞市',1,1) 
    insert into area values('广州市',1,1) 
    insert into area values('天河区',0,5) 
    insert into area values('绵阳市',1,2) 
    insert into area values('武汉市',1,3) 
    insert into area values('汉口区',0,8) 
    insert into area values('随州市',1,3)
    --创建临时表
    create table tmp (id int identity,Name varchar(10) ,order_by int ,father_ID int )
    go--创建查询指定节点及其所有子节点的函数
    create function f_cid(@ID int) returns @t_level table(id int , level int)
    as
    begin
      declare @level int
      set @level = 1
      insert into @t_level select @id , @level
      while @@ROWCOUNT > 0
      begin
        set @level = @level + 1
        insert into @t_level select a.id , @level
        from area a , @t_Level b
        where a.father_ID = b.id and b.level = @level - 1
      end
      return
    end
    go--创建存储过程并将数据插入临时表
    create proc my_proc 
    as
    begin
      declare @id as int
      set @id = 0
      while exists(select 1 from area where order_by = 2 and id > @id)
      begin
        set @id = (select min(id) from area where order_by = 2 and id > @id)
        insert into tmp(Name ,order_by ,father_ID) select a.name,a.order_by ,a.father_id from area a , f_cid(@id) b where a.id = b.id order by a.id 
      end
    end
    go
    exec my_proc--从临时表提取数据并显示
    select case when order_by = 2 then name
                when order_by = 1 then '  ' + name
                when order_by = 0 then '    ' + name
           end name
    from tmp order by iddrop function f_cid
    drop proc my_proc
    drop table area , tmp/*
    name           
    -------------- 
    广东省
      东莞市
      广州市
        天河区
    四川省
      绵阳市
    湖北省
      武汉市
        汉口区
      随州市(所影响的行数为 10 行)*/
      

  4.   


    /*---------------------------------
    --  Author : htl258(Tony)
    --  Date   : 2009-09-03 16:49:50
    --  Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86) 
    Mar 29 2009 10:27:29 
    Copyright (c) 1988-2008 Microsoft Corporation
    Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)---------------------------------*/
    --> 生成测试数据表:tbIf not object_id('[tb]') is null
    Drop table [tb]
    Go
    Create table [tb]([id] int,[name] nvarchar(2),[type] int,[parent] int)
    Insert [tb]
    Select 1,N'广东',1,0 union all
    Select 2,N'江西',1,0 union all
    Select 3,N'赣州',2,2 union all
    Select 4,N'广州',2,1 union all
    Select 5,N'天河',3,4 union all
    Select 6,N'赣县',3,3 union all
    Select 7,N'佛山',2,1 union all
    Select 8,N'南昌',2,2 union all
    Select 9,N'高明',3,7 union all
    Select 10,N'昌县',3,8 union all
    Select 11,N'深圳',2,1
    Go
    --Select * from [tb]-->SQL查询如下:
    ;with t as
    (
    select px=cast(ltrim(id) as varchar(500)),* from tb t 
    where not exists(select 1 from tb where [id]=t.[parent])
    union all
    select cast(b.px+','+ltrim(a.id) as varchar(500)),a.*
    from tb a,t b where a.[parent]=b.id
    )
    select id,name,type,[parent]
    from t
    order by px
    /*
    id name type parent
    1 广东 1 0
    11 深圳 2 1
    4 广州 2 1
    5 天河 3 4
    7 佛山 2 1
    9 高明 3 7
    2 江西 1 0
    3 赣州 2 2
    6 赣县 3 3
    8 南昌 2 2
    10 昌县 3 8
    */
      

  5.   

    -------------------------------------------
    --  Author : liangCK 小梁
    --  Comment: 小梁 爱 兰儿
    --  Date   : 2009-09-03 16:50:02
    -------------------------------------------
     
    --> 生成测试数据: @T
    DECLARE @T TABLE (id INT,name VARCHAR(4),type INT,parent INT)
    INSERT INTO @T
    SELECT 1,'广东',1,0 UNION ALL
    SELECT 2,'江西',1,0 UNION ALL
    SELECT 3,'赣州',2,2 UNION ALL
    SELECT 4,'广州',2,1 UNION ALL
    SELECT 5,'天河',3,4 UNION ALL
    SELECT 6,'赣县',3,3 UNION ALL
    SELECT 7,'佛山',2,1 UNION ALL
    SELECT 8,'南昌',2,2 UNION ALL
    SELECT 9,'高明',3,7 UNION ALL
    SELECT 10,'昌县',3,8 UNION ALL
    SELECT 11,'深圳',2,1--SQL查询如下:SELECT A.*
    FROM @T AS A
        LEFT JOIN @T AS B
    ON A.parent = B.id
    ORDER BY
        CASE WHEN B.id IS NULL THEN A.id 
             WHEN B.parent = 0 THEN B.id
             ELSE B.parent END,
        CASE WHEN B.parent = 0 THEN A.id
             ELSE A.parent END,
        A.id/*
    id          name type        parent
    ----------- ---- ----------- -----------
    1           广东   1           0
    4           广州   2           1
    5           天河   3           4
    7           佛山   2           1
    9           高明   3           7
    11          深圳   2           1
    2           江西   1           0
    3           赣州   2           2
    6           赣县   3           3
    8           南昌   2           2
    10          昌县   3           8(11 row(s) affected)*/
      

  6.   


    /*---------------------------------
    --  Author : htl258(Tony)
    --  Date   : 2009-09-03 16:49:50
    --  Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86) 
    Mar 29 2009 10:27:29 
    Copyright (c) 1988-2008 Microsoft Corporation
    Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)---------------------------------*/
    --> 生成测试数据表:tbIf not object_id('[tb]') is null
    Drop table [tb]
    Go
    Create table [tb]([id] int,[name] nvarchar(2),[type] int,[parent] int)
    Insert [tb]
    Select 1,N'广东',1,0 union all
    Select 2,N'江西',1,0 union all
    Select 3,N'赣州',2,2 union all
    Select 4,N'广州',2,1 union all
    Select 5,N'天河',3,4 union all
    Select 6,N'赣县',3,3 union all
    Select 7,N'佛山',2,1 union all
    Select 8,N'南昌',2,2 union all
    Select 9,N'高明',3,7 union all
    Select 10,N'昌县',3,8 union all
    Select 11,N'深圳',2,1
    Go
    --Select * from [tb]-->SQL查询如下:
    ;with t as
    (
    select px=cast(ltrim(id) as varchar(8000)),* from tb t 
    where not exists(select 1 from tb where [id]=t.[parent])
    union all
    select cast(b.px+','+right(10000+a.id,3) as varchar(8000)),a.*
    from tb a,t b where a.[parent]=b.id
    )
    select id,name,type,[parent]
    from t
    order by px
    /*
    id name type parent
    1 广东 1 0
    4 广州 2 1
    5 天河 3 4
    7 佛山 2 1
    9 高明 3 7
    11 深圳 2 1
    2 江西 1 0
    3 赣州 2 2
    6 赣县 3 3
    8 南昌 2 2
    10 昌县 3 8
    */modify
      

  7.   


    Create table T (id int, name nvarchar(20), type int, parent int)insert into T select 1,  N'广东'  ,1     , 0 
    insert into T select 2,  N'江西'  ,1     , 0 
    insert into T select 3,  N'赣州'  ,2     , 2 
    insert into T select 4,  N'广州'  ,2     , 1 
    insert into T select 5,  N'天河'  ,3     , 4 
    insert into T select 6,  N'赣县'  ,3     , 3 
    insert into T select 7,  N'佛山'  ,2     , 1 
    insert into T select 8,  N'南昌'  ,2     , 2 
    insert into T select 9,  N'高明'  ,3     , 7 
    insert into T select 10, N'昌县'  ,3     , 8 
    insert into T select 11, N'深圳'  ,2     , 1 GOdeclare @t table(id int, level int, sort nvarchar(4000))
    declare @level int
    set @level=0
    insert into @t select id,@level,name
    from T
    where type=1while @@rowcount>0
    begin
       set @level=@level+1
       insert into @t select a.id, @level, b.sort+a.name
      from T a , @t b
      where a.parent=b.id
       and   b.level=@level-1
    endselect a.*,  b.sort
    from T a ,@t b
    where a.id=b.id
    order by b.sortGO
    /*
    id          name                 type        parent      sort  
    ----------------------------------------------------------------------
    2 江西 1 0 江西
    8 南昌 2 2 江西南昌
    10 昌县 3 8 江西南昌昌县
    3 赣州 2 2 江西赣州
    6 赣县 3 3 江西赣州赣县
    1 广东 1 0 广东
    7 佛山 2 1 广东佛山
    9 高明 3 7 广东佛山高明
    11 深圳 2 1 广东深圳
    4 广州 2 1 广东广州
    5 天河 3 4 广东广州天河
    */drop table T
      

  8.   

    liangCK的精简又实用,谢谢,结贴
      

  9.   


    Create table T (id int, name nvarchar(20), type int, parent int)insert into T select 1,  N'广东'  ,1     , 0 
    insert into T select 2,  N'江西'  ,1     , 0 
    insert into T select 3,  N'赣州'  ,2     , 2 
    insert into T select 4,  N'广州'  ,2     , 1 
    insert into T select 5,  N'天河'  ,3     , 4 
    insert into T select 6,  N'赣县'  ,3     , 3 
    insert into T select 7,  N'佛山'  ,2     , 1 
    insert into T select 8,  N'南昌'  ,2     , 2 
    insert into T select 9,  N'高明'  ,3     , 7 
    insert into T select 10, N'昌县'  ,3     , 8 
    insert into T select 11, N'深圳'  ,2     , 1 GOdeclare @t table(id int, level int, sort nvarchar(4000))
    declare @level int
    set @level=0
    insert into @t select id,@level,name
    from T
    where type=1while @@rowcount>0
    begin
       set @level=@level+1
       insert into @t select a.id, @level, b.sort+a.name
      from T a , @t b
      where a.parent=b.id
       and   b.level=@level-1
    endselect  Space(b.level*4)+'| -- ' +a.name     --改這裡即可
    from T a ,@t b
    where a.id=b.id
    order by b.sortGO
    /*| -- 江西
        | -- 南昌
            | -- 昌县
        | -- 赣州
            | -- 赣县
    | -- 广东
        | -- 佛山
            | -- 高明
        | -- 深圳
        | -- 广州
            | -- 天河
    */drop table T