使用CTE的递归查询 - 给定父级的子列的SUM

时间:2012-01-12 15:12:31

标签: sql-server sql-server-2005 tsql

我有一个论坛数据库,可以将论坛信息存储在一个列中。该论坛允许无限制的子论坛。

表名 - 论坛

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

如果ForumID作为参数,我会尝试SUM TopicCountReplyCount所有子条目。我还尝试返回最新的LastPost,其中指定为DATETIME

我搜索了谷歌和这个论坛,并了解我应该使用递归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 个答案:

答案 0 :(得分:5)

你做得很好 - 你很接近: - )

基本上,您需要:

  • 定义在CTE之前挑选的初始论坛
  • 为定义的论坛创建“锚点”查询
  • 然后迭代所有孩子并总结TopicCountReplyCount计数器

所以你的代码应该是这样的:

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

当然,您可以将其包装到一个存储过程中,该过程将初始的“root”ForumID作为参数。