sql >> Database >  >> RDS >> Sqlserver

SQL Server 2008 CTE-recursie

Niet zo moeilijk om te doen:

;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

Geeft me een output van:

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

Even terzijde:de "diepte" kan gemakkelijk worden berekend door de CTE en u hoeft die niet per se in uw tabel op te slaan (zie het Level kolom die ik heb toegevoegd):

;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. Bewaar mysql-query naar Excel-bestand van php-webpagina

  2. mysql-python:een volledig stand-alone _mysql.so bouwen op Mac OS X?

  3. Hoe JSON-object van PHP te retourneren om te lezen vanuit de Android-app

  4. Hoe maak je een MySQL-databaseback-up met MySQL Workbench?