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

use*_*751 4 t-sql sql-server sql-server-2005

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

表名 - 论坛

| ForumID | ParentForumID | Name | Description | TopicCount | ReplyCount | LastPost |
Run Code Online (Sandbox Code Playgroud)

给定ForumID的参数我想SUMTopicCountReplyCount所有子项.我也试图返回最新的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
Run Code Online (Sandbox Code Playgroud)

其中1 =论坛ID的参数.

在此先感谢您的帮助!

mar*_*c_s 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
Run Code Online (Sandbox Code Playgroud)

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