У меня есть таблица:
Series ======== ID SeriesName ParentSeriesID
Ряд может быть "корневым" рядом, (ParentSeriesID
0 или пустой указатель), или он может иметь Родителя. Ряд может также быть несколькими уровнями вниз, т.е. его Родитель имеет Родителя, который имеет Родителя и т.д.
Как я могу запросить таблицу для получения Ряда, он - идентификатор и ВЕСЬ порожденный Ряд?
До сих пор я попробовал:
SELECT child.*
FROM Series parent JOIN Series child ON child.ParentSeriesID = parent.ID
WHERE parent.ID = @ParentID
Но это только возвращает первый уровень детей, я хочу родительский узел и все "нисходящие" узлы. Я не уверен, как прогрессировать отсюда.
Если вы используете 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
Подробнее:
Рекурсивные запросы с использованием общих табличных выражений
Используйте функцию 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
Вы можете просмотреть пример здесь: