Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Query ricorsiva con CTE - SUM delle colonne figlio per un determinato genitore

Stai andando bene - sei abbastanza vicino :-)

Fondamentalmente, devi:

  • definire il forum iniziale da selezionare prima del CTE
  • crea una query di "ancoraggio" a quel forum definito
  • quindi esegui l'iterazione su tutti i bambini e riepiloga il TopicCount e ReplyCount contatori

Quindi il tuo codice dovrebbe assomigliare a questo:

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

Ovviamente, potresti racchiuderlo in una procedura memorizzata che prenderebbe la "root" iniziale ForumID come parametro .