就是一个简单的留言板功能. 有表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 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
select * from lyb order by (case when MainBH=0 then BH else MainBH end),mainbh
否则要用递归找出顶级BH再排序.
----------- ----------- --------------------
1 0 新主题1
3 1 回复,新主题1,1
5 1 回复,新主题1,2
2 0 新主题2
4 2 回复,新主题2,1(5 行受影响)
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
-- 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 行受影响)*/
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
)
(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 行受影响)