就是一个简单的留言板功能. 有表lyb如下BH      MainBH  Content
1 0 新主题1
2 0 新主题2
3 1 回复 新主题1 1
4 2 回复 新主题2 1
5 1 回复 新主题1 2BH:自增列
MainBH:为0表示为新的主题, 不为0表示对应BH的回复内容想要select以下格式, 应该怎么写:BH      MainBH  Content
1 0 新主题1
3 1 回复 新主题1 1
5 1 回复 新主题1 2
2 0 新主题2
4 2 回复 新主题2 1

解决方案 »

  1.   

    如果只有两级:
    select * from lyb order by (case when MainBH=0 then BH else MainBH end),mainbh
    否则要用递归找出顶级BH再排序.
      

  2.   

    BH          MainBH      Content
    ----------- ----------- --------------------
    1           0           新主题1
    3           1           回复,新主题1,1
    5           1           回复,新主题1,2
    2           0           新主题2
    4           2           回复,新主题2,1(5 行受影响)
      

  3.   

    order by (case when MainBH=0 then BH else MainBH end),mainbh,BH
      

  4.   


    create table lyb(BH int,MainBH int,Content varchar(20))insert into lyb
    select 1, 0, '新主题1' union all
    select 2, 0, '新主题2' union all
    select 3, 1, '回复 新主题1 1' union all
    select 4, 2, '回复 新主题2 1' union all
    select 5, 1, '回复 新主题1 2'select *
    from lyb
    order by substring(Content,charindex('新主题',Content)+3,1),MainBHBH          MainBH      Content
    ----------- ----------- --------------------
    1           0           新主题1
    3           1           回复 新主题1 1
    5           1           回复 新主题1 2
    2           0           新主题2
    4           2           回复 新主题2 1
      

  5.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2011-09-22 11:20:22
    -- Verstion:
    --      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86) 
    -- Apr 22 2011 11:57:00 
    -- Copyright (c) Microsoft Corporation
    -- Enterprise Evaluation Edition on Windows NT 6.1 <X64> (Build 7600: ) (WOW64)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([BH] int,[MainBH] int,[Content] varchar(120))
    insert [tb]
    select 1,0,'新主题1' union all
    select 2,0,'新主题2' union all
    select 3,1,'回复 新主题1 1' union all
    select 4,2,'回复 新主题2 1' union all
    select 5,1,'回复 新主题1 2'
    --------------开始查询--------------------------
    ;WITH T AS
    (
        SELECT *,CAST(BH AS VARBINARY(MAX)) AS px 
        FROM tb AS A
        WHERE NOT EXISTS(SELECT * FROM tb WHERE BH=A.[MainBH])
        UNION ALL 
        SELECT A.*,CAST(B.px+CAST(A.BH AS VARBINARY) AS VARBINARY(MAX))  
        FROM tb AS A
            JOIN T AS B
               ON A.[MainBH]=B.BH
    )
    SELECT BH,MainBH ,Content FROM T 
    ORDER BY px
    ----------------结果----------------------------
    /* BH          MainBH      Content
    ----------- ----------- ------------------------------------------------------------------------------------------------------------------------
    1           0           新主题1
    3           1           回复 新主题1 1
    5           1           回复 新主题1 2
    2           0           新主题2
    4           2           回复 新主题2 1(5 行受影响)*/
      

  6.   


    create table tb
    (BH int identity(1,1),MainBH int,Content nvarchar(50))

    insert into tb(MainBH,Content) values( 0,'新主题1')
    insert into tb(MainBH,Content) values (0 ,'新主题2')
    insert into tb(MainBH,Content) values (1 ,'回复 新主题1 1')
    insert into tb(MainBH,Content) values (2 ,'回复 新主题2 1' )
    insert into tb(MainBH,Content) values (1 ,'回复 新主题1 2')

    ;WITH cte(BH,MainBH,Content,classid)
    AS
    (
    SELECT BH,MainBH,Content,BH as classid FROM tb
    WHERE MainBH =0
    UNION ALL
    SELECT t1.BH,t1.MainBH,t1.Content,t1.MainBH as classid FROM tb t1 INNER JOIN cte t2
    ON t1.MainBH=t2.BH
    )
      

  7.   

    create table tb
    (BH int identity(1,1),MainBH int,Content nvarchar(50))

    insert into tb(MainBH,Content) values( 0,'新主题1')
    insert into tb(MainBH,Content) values (0 ,'新主题2')
    insert into tb(MainBH,Content) values (1 ,'回复 新主题1 1')
    insert into tb(MainBH,Content) values (2 ,'回复 新主题2 1' )
    insert into tb(MainBH,Content) values (1 ,'回复 新主题1 2')

    ;WITH cte(BH,MainBH,Content,classid)
    AS
    (
    SELECT BH,MainBH,Content,BH as classid FROM tb
    WHERE MainBH =0
    UNION ALL
    SELECT t1.BH,t1.MainBH,t1.Content,t1.MainBH as classid FROM tb t1 INNER JOIN cte t2
    ON t1.MainBH=t2.BH
    ) SELECT BH,MainBH,Content FROM cte order by classid

    BH          MainBH      Content
    ----------- ----------- --------------------------------------------------
    1           0           新主题1
    3           1           回复 新主题1 1
    5           1           回复 新主题1 2
    2           0           新主题2
    4           2           回复 新主题2 1(5 行受影响)