Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изберете изявление, за да върнете родител и безкрайни деца

Позовавайки се на този отговор:

SQL Server CTE Parent Child рекурсивно

Ето работеща версия с вашата схема:

Скрипт за създаване на таблица

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')
;

Рекурсивен 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

Ключовата част е в CTE създаване, където UNION ALL се присъединява отново към набора от резултати, като се присъединява към ID към ParentId , което не ограничава броя на нивата.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използвайте PARSENAME(), за да върнете част от име на обект в SQL Server

  2. Как да получите календарно тримесечие от дата в TSQL

  3. Сравняване на дати, съхранени като varchar

  4. Как да ускорите своя SQL сървър с помощта на мониторинг на производителността на базата данни

  5. Добавете уникално ограничение към комбинация от две колони