sql >> Databasteknik >  >> RDS >> Sqlserver

CTE Rekursion för att få trädhierarki

Prova detta:

;WITH items AS (
    SELECT EstimateItemID, ItemType
    , 0 AS Level
    , CAST(EstimateItemID AS VARCHAR(255)) AS Path
    FROM EstimateItem 
    WHERE ParentEstimateItemID IS NULL AND EstimateID = @EstimateID

    UNION ALL

    SELECT i.EstimateItemID, i.ItemType
    , Level + 1
    , CAST(Path + '.' + CAST(i.EstimateItemID AS VARCHAR(255)) AS VARCHAR(255))
    FROM EstimateItem i
    INNER JOIN items itms ON itms.EstimateItemID = i.ParentEstimateItemID
)

SELECT * FROM items ORDER BY Path

Med Path - rader sorterade efter föräldrarnoder

Om du vill sortera barnnoder efter ItemType för varje nivå, än du kan spela med Level och SUBSTRING av Path kolumn....

Här SQLFiddle med exempel på data



  1. Hur DAYOFYEAR() fungerar i MariaDB

  2. Hantera din MS SQL-replikering

  3. oracle sql-fråga för att lista alla datum för föregående månad

  4. Rätt sätt att ge användare tillgång till ytterligare scheman i Oracle