Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

CTE рекурсия за получаване на йерархия на дървото

Опитайте това:

;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

С Path - редове a, сортирани по родителски възли

Ако искате да сортирате дъщерни възли по ItemType за всяко ниво, отколкото можете да играете с Level и SUBSTRING на Path колона....

Тук SQLFiddle с извадка от данни



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да задам стойност на променлива с помощта на 'execute' в t-sql?

  2. SQL Server 2008 - Как да върна дефиниран от потребителя тип таблица от функция с стойност на таблица?

  3. SYSDATETIME() Примери в SQL Server (T-SQL)

  4. Не може да се премахне схемата, защото тя не съществува или нямате разрешение. - SQL Server / TSQL урок, част 29

  5. FLOOR() Примери в SQL Server