Рекурсивный запрос с CTE - SUM дочерних столбцов для данного родителя - PullRequest
4 голосов
/ 12 января 2012

У меня есть база данных форума, которая хранит информацию о форуме в одном столбце.Форум допускает неограниченное количество подфорумов.

Имя таблицы - форумы

| ForumID | ParentForumID | Name | Description | TopicCount | ReplyCount | LastPost |

В качестве параметра ForumID я пытаюсь SUM TopicCount и ReplyCount длявсе дочерние записи.Я также пытаюсь вернуть последнюю версию LastPost, которая указана как DATETIME.

Я искал в Google и на этом форуме и понимаю, что должен использовать рекурсивный CTE, но у меня возникают некоторые трудности с пониманиемсинтаксис.Вот мой CTE - работа в процессе.

   WITH CTE (ForumID, ParentForumID)
   AS
   (
       SELECT ForumID AS Descendant, ParentForumID as Ancestor
       FROM forums
       UNION ALL
       SELECT e.Ancestor
       FROM
          CTE as e
          INNER JOIN CTE AS d
          ON Descendant = d.ParentForumID
   )
   SELECT e.Descendant, SUM(TopicCount) AS topics, SUM(ReplyCount) AS replys
   FROM CTE e
   WHERE e.Ancestor = 1

Где 1 = параметр для ID форума.

Заранее спасибо за помощь!

1 Ответ

5 голосов
/ 12 января 2012

У вас все в порядке - вы достаточно близки: -)

В основном вам необходимо:

  • определить начальный форум, который нужно выбрать до CTE
  • создайте запрос привязки к этому форуму, определенному
  • , затем выполните итерацию по всем дочерним элементам и суммируйте счетчики TopicCount и ReplyCount

Так что ваш кодвыглядит примерно так:

DECLARE @RootForumID INT
SET @RootForumID = 1  -- or whatever you want...

;WITH CTE AS
(
   -- define the "anchor" query - select the chosen forum
   SELECT 
       ForumID, TopicCount, ReplyCount, LastPost
   FROM 
       dbo.forums
   WHERE
       ForumID = @RootForumID

   UNION ALL

   -- select the child rows
   SELECT 
       f.ForumID, f.TopicCount, f.ReplyCount, f.LastPost
   FROM 
       dbo.forums f
   INNER JOIN
       CTE on f.ParentForumID = CTE.ForumID
)
SELECT 
    SUM(TopicCount) AS topics, 
    SUM(ReplyCount) AS replys,
    MAX(LastPost) AS 'Latest Post' 
FROM 
    CTE

Конечно, вы можете заключить это в хранимую процедуру, которая в качестве параметра примет первоначальный «корень» ForumID.

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