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

SQL Server 2008 CTE rekurze

Není to tak těžké:

;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

Dává mi výstup:

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

Jako vedlejší poznámka:"hloubku" lze snadno vypočítat pomocí CTE a nemusíte ji nutně ukládat do tabulky (viz Level sloupec, který jsem přidal):

;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. Získání duplicitního počtu při provádění INSERT IGNORE přes JDBC

  2. Vnořené vrácení transakce mezi dvěma body uložení?

  3. událost mysql nefunguje

  4. Jaký je nejlepší způsob vložení více řádků do PHP PDO MYSQL?