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

CTE Recursion per ottenere la gerarchia ad albero

Prova questo:

;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

Con Path - righe a ordinate per nodi genitori

Se vuoi ordinare i nodi figlio per ItemType per ogni livello, che puoi giocare con Level e SUBSTRING di Path colonna....

Qui SQLFiddle con un campione di dati