sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server 2008 CTE Rekursion

Inte riktigt så svårt att göra:

;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

Ger mig en utdata av:

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

Som en sidoanteckning:"djupet" kan enkelt beräknas av CTE och du behöver inte nödvändigtvis lagra det i din tabell (se Level kolumn som jag har lagt till):

;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. Oracle jämför två olika datum

  2. Hur man skriver mysql-fråga för att kontrollera flera variabelval där formulärinlämning kan matcha 1 0f 5 fält

  3. Vad är det bästa sättet att infoga och uppdatera en enradstabell i MySQL?

  4. välj alla poster som skapats inom en timme