Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

CTE Recursion pour obtenir la hiérarchie de l'arborescence

Essayez ceci :

;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

Avec Path - lignes triées par nœuds parents

Si vous voulez trier les nœuds enfants par ItemType pour chaque niveau, vous pouvez jouer avec Level et SUBSTRING de Path colonne....

Ici SQLFiddle avec un échantillon de données