Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Consulta recursiva com CTE - SOMA de colunas filhas para um determinado pai


Você está indo bem - você está bem perto :-)

Basicamente, você precisa:
  • defina o fórum inicial a ser escolhido antes do CTE
  • criar uma consulta "âncora" para esse fórum definido
  • em seguida, itere sobre todos os filhos e resuma o TopicCount e ReplyCount contadores

Então seu código deve ficar assim:
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

Claro, você poderia envolver isso em um procedimento armazenado que levaria a "raiz" inicial ForumID como parâmetro.