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

SQL Server rekurzivní samo připojení

Rekurzivní CTE k záchraně....

Vytvořte a vyplňte vzorovou tabulku (Prosím uložte nám tento krok ve svých budoucích otázkách):

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
)

Dotaz:

SELECT id, name, path
FROM CTE

Výsledky:

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

Podívejte se na online demo na rextester




  1. Jak spustit, restartovat, zkontrolovat stav a zastavit server MySQL

  2. Oracle Pivot dotaz poskytuje sloupce s uvozovkami kolem názvů sloupců. Co?

  3. Zkopírujte tabulku z jedné databáze do druhé v Postgresu

  4. MySQL:Přidejte sloupec sekvence na základě jiného pole