Имам таблица:
серия ======== документ за самоличност 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