sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server rekursiv självanslutning

Rekursiv cte till undsättning....

Skapa och fyll i exempeltabell (Vänligen spara oss detta steg i dina framtida frågor):

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)

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
)

Frågan:

SELECT id, name, path
FROM CTE

Resultat:

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

Se onlinedemo på rextester




  1. Tar rekordet med maxdatum

  2. visa flera poster med hjälp av resultatuppsättningen

  3. Så här fixar du "Konverteringen misslyckades när värdet konverterades till datatyp" i SQL Server

  4. Transponera ett sql-resultat så att en kolumn går till flera kolumner