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

Recursão CTE para obter hierarquia de árvore


Tente isto:
;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

Com Path - linhas ordenadas por nós pais

Se você quiser classificar os childnodes por ItemType para cada nível, do que você pode jogar com Level e SUBSTRING de Path coluna....

Aqui SQLFiddle com amostra de dados