2012-01-12 48 views
4

我有一個將論壇信息存儲在單個列中的論壇數據庫。該論壇允許無限次的論壇。CTE的遞歸查詢 - 給定父級子列的SUM

表的名字 - 論壇

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

給出一個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 

其中1 =論壇ID的參數。

在此先感謝您的幫助!

+0

你只需要孩子,還是需要孫輩和曾孫等? – cadrell0 2012-01-12 15:28:06

回答

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 

當然,你可以換到,將採取最初的「根」 ForumID作爲參數的存儲過程這一點。

+0

所以你必須首先聲明ID。您的解決方案完美運作謝謝 – user1145751 2012-01-12 16:02:18

+0

@ user1145751:這只是我通常這樣做的方式(在一個存儲過程中,「root」ID作爲參數傳遞) - 但我相信可能有其他方法來實現這一點! – 2012-01-12 17:46:18