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

Rekursiv forespørgsel med CTE - SUM af underordnede kolonner for en given overordnet

Du har det okay - du er ret tæt på :-)

Grundlæggende skal du:

  • definer det første forum, der skal vælges før CTE
  • opret en "anker"-forespørgsel til det definerede forum
  • Generer derefter over alle børn og opsummer TopicCount og ReplyCount tællere

Så din kode skulle se sådan ud:

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

Selvfølgelig kan du pakke dette ind i en lagret procedure, der ville tage den indledende "rod" ForumID som parameter .




  1. Kontrol af begrænsninger:TRY/CATCH vs Exists()

  2. Kaldning af MySQL Stored Procedure fra .NET DB Context throws Kun MySqlParameter-objekter må gemmes'

  3. MySQL FULLTEXT søgning

  4. Fremmede/accentuerede tegn i sql-forespørgsel