Как к сам ПРИСОЕДИНЯЮТСЯ рекурсивно в SQL?

У меня есть таблица:

Series
========
ID
SeriesName
ParentSeriesID

Ряд может быть "корневым" рядом, (ParentSeriesID 0 или пустой указатель), или он может иметь Родителя. Ряд может также быть несколькими уровнями вниз, т.е. его Родитель имеет Родителя, который имеет Родителя и т.д.

Как я могу запросить таблицу для получения Ряда, он - идентификатор и ВЕСЬ порожденный Ряд?

До сих пор я попробовал:

 SELECT child.*
 FROM Series parent JOIN Series child ON child.ParentSeriesID = parent.ID
 WHERE parent.ID = @ParentID

Но это только возвращает первый уровень детей, я хочу родительский узел и все "нисходящие" узлы. Я не уверен, как прогрессировать отсюда.

14
задан Pranay Rana 12 August 2010 в 20:07
поделиться

2 ответа

Если вы используете SQL Server 2005+, вы можете использовать выражения общей таблицы

With Family As 
( 
Select s.ID, s.ParentSeriesId, 0 as Depth
From Series s
Where ID = @ParentID 
Union All 
Select s2.ID, s2.ParentSeriesId, Depth + 1
From Series s2
    Join Family 
        On Family.ID = s2.ParentSeriesId 
) 
Select *
From Family 

Подробнее:

Рекурсивные запросы с использованием общих табличных выражений

14
ответ дан 1 December 2019 в 12:51
поделиться

Используйте функцию CTE , доступную на сервере slq 2005 г. и более поздних версиях, для повторного запроса

USE AdventureWorks
GO
WITH Emp_CTE AS (
SELECT EmployeeID, ContactID, LoginID, ManagerID, Title, BirthDate
FROM HumanResources.Employee
WHERE ManagerID IS NULL
UNION ALL
SELECT e.EmployeeID, e.ContactID, e.LoginID, e.ManagerID, e.Title, e.BirthDate
FROM HumanResources.Employee e
INNER JOIN Emp_CTE ecte ON ecte.EmployeeID = e.ManagerID
)
SELECT *
FROM Emp_CTE
GO

Вы можете просмотреть пример здесь:

SQL SERVER - простой пример рекурсии CTE

2
ответ дан 1 December 2019 в 12:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: