sql >> Base de Datos >  >> RDS >> Sqlserver

Recursión CTE para obtener la jerarquía del árbol

Prueba esto:

;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 - filas ordenadas por nodos principales

Si desea ordenar los childnodes por ItemType para cada nivel, de lo que puedes jugar con Level y SUBSTRING de Path columna....

Aquí SQLFiddle con una muestra de datos