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

SQL Server рекурсивно самостоятелно присъединяване

Рекурсивно cte на помощ....

Създайте и попълнете примерна таблица (Моля запишете ни тази стъпка в бъдещите си въпроси):

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
)

Запитването:

SELECT id, name, path
FROM CTE

Резултати:

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

Вижте онлайн демонстрация на rextester




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получа идентификатор за вмъкване в MSSQL в PHP?

  2. SQL JOIN срещу IN производителност?

  3. 3 начина да получите списък с бази данни в SQL Server (T-SQL)

  4. Вмъкване на данни в SQL Server 2017

  5. Инсталиране на клъстер за отказване на SQL сървър -3