sql >> Databáze >  >> RDS >> Sqlserver

CTE Recursion pro získání stromové hierarchie

Zkuste toto:

;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

Pomocí Path - řádky a seřazené podle nadřazených uzlů

Pokud chcete seřadit podřízené uzly podle ItemType pro každou úroveň pak můžete hrát s Level a SUBSTRING z Path sloupec....

Zde SQLFiddle s ukázkou dat



  1. Rozdělte čárkami oddělené hodnoty sloupce v řádku pomocí dotazu Oracle SQL

  2. Vytvoření globální dočasné tabulky v Oracle

  3. Oracle na PostgreSQL — Kurzory a běžné tabulkové výrazy

  4. Formát sysjobhistory datum, čas a trvání sloupce na SQL Server