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

SQL Server 2008 CTE рекурсия

Всъщност не е толкова трудно да се направи:

;WITH cte AS
(
    SELECT CAST('/' + Name AS VARCHAR(50)) as 'CteName', ID
    FROM dbo.YourTable
    WHERE parent_id IS NULL

    UNION ALL

    SELECT CAST(cte.CteName + '/' + Name AS VARCHAR(50)), t.ID
    FROM dbo.YourTable t
    INNER JOIN cte ON t.parent_id = cte.id
)
SELECT cteName FROM cte
ORDER BY ID

Дава ми резултат от:

/A
/A/B
/A/B/C
/A/D

Като странична бележка:„дълбочината“ може лесно да бъде изчислена от CTE и не е задължително да съхранявате това във вашата таблица (вижте Level колона, която добавих):

;WITH cte AS
(
    SELECT 
       CAST('/' + Name AS VARCHAR(50)) as 'CteName', ID, 
       1 AS 'Level'
    FROM dbo.YourTable
    WHERE parent_id IS NULL

    UNION ALL

    SELECT 
       CAST(cte.CteName + '/' + Name AS VARCHAR(50)), t.ID,
       cte.Level + 1 AS 'Level'
    FROM dbo.YourTable t
    INNER JOIN cte ON t.parent_id = cte.id
)
SELECT cteName FROM cte
ORDER BY Level, ID


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да избера от списък със стойности в SQL Server

  2. Правилният начин за прилагане на уникално ограничение, което позволява множество NULL стойности в SQL Server

  3. PIVOT в sql 2005

  4. PARSE() срещу CAST() срещу CONVERT() в SQL Server:Каква е разликата?

  5. MS SQL Server на Linux срещу тест за производителност на Windows, за да забележите разликата