sql >> Database >  >> RDS >> Sqlserver

SQL Server recursieve self-join

Recursieve reddingsboei....

Maak een voorbeeldtabel en vul deze in (Alsjeblieft bespaar ons deze stap bij uw toekomstige vragen):

DECLARE @T as table
(
    id int,
    name varchar(100),
    parent_id int
)

INSERT INTO @T VALUES
(1, 'A', NULL),
(2, 'A.1', 1),
(3, 'A.2', 1),
(4, 'A.1.1', 2),
(5, 'B', NULL),
(6, 'B.1', 5),
(7, 'B.1.1', 6),
(8, 'B.2', 5),
(9, 'A.1.1.1', 4),
(10, 'A.1.1.2', 4)

De cte:

;WITH CTE AS
(
    SELECT id, name, name as path, parent_id
    FROM @T 
    WHERE parent_id IS NULL
    UNION ALL
    SELECT t.id, t.name, cast(cte.path +','+ t.name as varchar(100)), t.parent_id
    FROM @T t
    INNER JOIN CTE ON t.parent_id = CTE.id
)

De vraag:

SELECT id, name, path
FROM CTE

Resultaten:

id      name        path
1       A           A
5       B           B
6       B.1         B,B.1
8       B.2         B,B.2
7       B.1.1       B,B.1,B.1.1
2       A.1         A,A.1
3       A.2         A,A.2
4       A.1.1       A,A.1,A.1.1
9       A.1.1.1     A,A.1,A.1.1,A.1.1.1
10      A.1.1.2     A,A.1,A.1.1,A.1.1.2

Bekijk online demo op rextester




  1. De achtergrondkleur van een formulier wijzigen in Access 2016

  2. Beste gegevenstype voor het opslaan van valutawaarden in een MySQL-database

  3. MySQL op Azure Performance Benchmark – ScaleGrid vs. Azure Database

  4. Waarom kan ik geen alias gebruiken in een count(*)-kolom en ernaar verwijzen in een hebbende clausule?