Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Rekurencja CTE w SQL Server 2008

Naprawdę nie jest to takie trudne:

;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

Daje mi wynik:

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

Na marginesie:"głębokość" może być łatwo obliczona przez CTE i nie musisz koniecznie przechowywać tego w swojej tabeli (zobacz Level kolumna, którą dodałem):

;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. Sekwencja jako wartość domyślna dla kolumny

  2. Dlaczego nie mogę użyć aliasu w instrukcji DELETE?

  3. Przeanalizuj ciąg JSON w sql

  4. SQL Server 2008 dzieli, sortuje i łączy wartości

  5. Połącz się z bazą danych SQL Server z Node.js