Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Rekursive Abfrage mit CTE - SUM der untergeordneten Spalten für ein bestimmtes übergeordnetes Element

Du machst das gut - du bist ganz nah dran :-)

Grundsätzlich müssen Sie:

  • definieren Sie das anfängliche Forum, das vor dem CTE ausgewählt werden soll
  • Erstellen Sie eine "Anker"-Abfrage zu diesem definierten Forum
  • Durchlaufen Sie dann alle Kinder und summieren Sie den TopicCount und ReplyCount Zähler

Ihr Code sollte also etwa so aussehen:

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

Natürlich könnten Sie dies in eine gespeicherte Prozedur einpacken, die die anfängliche "Root" ForumID nehmen würde als Parameter .