Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wybierz oświadczenie, aby zwrócić rodzica i nieskończone dzieci

Odnosząc się do tej odpowiedzi:

Rekursywne CTE SQL Server CTE nadrzędny/podrzędny

Oto działająca wersja ze schematem:

Skrypt tworzenia tabeli

CREATE TABLE YOUR_TABLE
    ([ID] int, [ParentID] int, [Name] varchar(21))
;
    
INSERT INTO YOUR_TABLE
    ([ID], [ParentID], [Name])
VALUES
    (1, NULL, 'A root'),
    (2, NULL, 'Another root'),
    (3, 1, 'Child of 1'),
    (4, 3, 'Grandchild of 1'),
    (5, 4, 'Great grandchild of 1'),
    (6, 1, 'Child of 1'),
    (7, NULL, 'Another root'),
    (8, 7, 'Child of 6')
;

Rekurencyjne CTE

DECLARE @ID INT = 1

;WITH ParentChildCTE
AS (
    SELECT ID, ParentId, Name        
    FROM YOUR_TABLE
    WHERE Id = @ID

    UNION ALL

    SELECT T1.ID, T1.ParentId, T1.Name        
    FROM YOUR_TABLE T1
    INNER JOIN ParentChildCTE T ON T.ID = T1.ParentID
    WHERE T1.ParentID IS NOT NULL
    )
SELECT *
FROM ParentChildCTE

Kluczowa część znajduje się w CTE tworzenie, w którym UNION ALL dołącza z powrotem do zestawu wyników, dołączając do ID do ParentId , co nie ogranicza liczby poziomów.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwertuj „czas” na „smalldatetime” w SQL Server (przykłady T-SQL)

  2. Jak przekonwertować listę rozdzielaną przecinkami na wiersze w SQL Server

  3. Jak używać operatora BETWEEN w SQL Server

  4. Kiedy muszę używać początku/końca bloków i słowa kluczowego Go w programie SQL Server?

  5. Najszybszy sposób na ustalenie, czy rekord istnieje