sql >> Database >  >> RDS >> Sqlserver

CTE-recursie om boomhiërarchie te krijgen

Probeer dit:

;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

Met Path - rijen gesorteerd op bovenliggende knooppunten

Als u childnodes wilt sorteren op ItemType voor elk niveau, dan kun je spelen met Level en SUBSTRING van Path kolom....

Hier SQLFiddle met gegevensvoorbeeld



  1. Oracle JDBC intermitterend verbindingsprobleem

  2. Meest efficiënte manier om rijen in de MySQL-database in te voegen

  3. Berekening van de gemiddelde voorraadkosten in SQL

  4. OPENXML met xmlns:dt