/ / Как да се включите рекурсивно в SQL? - sql, sql-server-2005, tsql, йерархични данни

Как да се включите рекурсивно в SQL? - sql, sql-server-2005, tsql, йерархични данни

Имам таблица:

серия ======== документ за самоличност SERIESNAME ParentSeriesID

Серията може да бъде серия "корен", (ParentSeriesID е 0 или нула) или може да има родител. Серията може да бъде и няколко нива надолу, т.е. нейният родител има родител, който има родител и т.н.

Как мога да попитам масата, за да получи серия от ID и всички поредици от потомци "?

Досега се опитах:

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

Но това връща само първото ниво на децата, искам родителския възел и всички "надолу" възли. Не съм сигурен как да напредва оттук.

Отговори:

13 за отговор № 1

Ако използвате 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

За още:

Рекурсивни заявки, използващи израз на обща таблица


5 за отговор № 2

Току-що усъвършенствам работата на Томас. Ако трябва да получите дълбочината на йерархията и да получите парентида тук е кодът.

Това беше почти същото с работата на Томас ".

With Family As
(
Select s.ID, s.ParentSeriesId, 0 as Depth
From Series s
Where ID = @ParentID <--- this was removed if you intend to get all hierarchy of the record. You can retain this if you want
Union All
Select s2.ID, s2.ParentSeriesId < --- change to **Family.ParentID**, Depth + 1
From Series s2
Join Family
On Family.ID = s2.ParentSeriesId
)
Select *
From Family

Това е всичко. Знам, че е твърде късно, но се надявам, че всеки, който се сблъска с това, може да им помогне. Благодаря на Тома за оригиналния код. :)


2 за отговор № 3

Да се ​​възползват от CTE функция avaiable в slq сървър 2005 нататък за recurisve заявка

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