查询线程讨论

时间:2011-08-07 09:29:05

标签: sql-server-2008

我有一个包含自引用InReplyTo的表格,其中包含以下数据:

PostID InReplyTo Depth
------ --------- -----
1      null      0
2      1         1
3      1         1
4      2         2
5      3         2
6      4         3
7      1         1
8      5         3
9      2         2

我想写一个查询,它将以它的线程形式返回这些数据,以便ID = 2的帖子及其所有后代将在PostID = 3之前输出,依此类推,无限深度

PostID InReplyTo Depth
------ --------- -----
1      null      0
2      1         1
4      2         2
6      4         3
9      2         2
3      1         1
5      3         2
8      5         3
7      1         1

有没有简单的方法来实现这一目标?我能够在这个阶段修改数据库结构,那么新的hierarchy数据类型是最简单的方法吗?或者也许是一个递归的CTE?

2 个答案:

答案 0 :(得分:1)

-- Test table
declare @T table (PostID int, InReplyTo int, Depth int)

insert into @T values  (1,  null, 0), (2,  1,  1), (3,  1,  1), (4,  2,  2), 
(5,  3,  2), (6,  4,  3), (7,  1,  1), (8,  5,  3),(9,  2,  2)

-- The post to get the hierarchy from
declare @PostID int = 1

-- Recursive cte that builds a string to use in order by
;with cte as
(
  select T.PostID,
         T.InReplyTo,
         T.Depth,
         right('0000000000'+cast(T.PostID as varchar(max)), 10)+'/' as Sort
  from @T as T
  where T.PostID = @PostID
  union all
  select T.PostID,
         T.InReplyTo,
         T.Depth,
         C.Sort+right('0000000000'+cast(T.PostID as varchar(max)), 10)+'/'
  from @T as T
    inner join cte as C
      on T.InReplyTo = C.PostID
)
select PostID,
       InReplyTo,
       Depth,
       Sort
from cte
order by Sort

结果:

PostID      InReplyTo   Depth       Sort
----------- ----------- ----------- --------------------------------------------
1           NULL        0           0000000001/
2           1           1           0000000001/0000000002/
4           2           2           0000000001/0000000002/0000000004/
6           4           3           0000000001/0000000002/0000000004/0000000006/
9           2           2           0000000001/0000000002/0000000009/
3           1           1           0000000001/0000000003/
5           3           2           0000000001/0000000003/0000000005/
8           5           3           0000000001/0000000003/0000000005/0000000008/
7           1           1           0000000001/0000000007/

答案 1 :(得分:0)

您正在寻找的确是recursive query

可以找到与您的案例匹配的示例here