Запрос на обсуждение темы - PullRequest
       3

Запрос на обсуждение темы

1 голос
/ 07 августа 2011

У меня есть отдельная таблица с собственной ссылкой 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 ]

1 голос
/ 07 августа 2011
-- 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/
0 голосов
/ 07 августа 2011

То, что вы ищете, действительно является рекурсивным запросом .

Пример соответствия вашему делу можно найти здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...