Вижте:
- SQL Server - Прост пример за рекурсивен CTE
- MSDN:Рекурсивни заявки, използващи общ израз на таблица
- SQL Server рекурсивен CTE (това изглежда почти като точно това, върху което работите!)
Актуализация:
Правилният рекурсивен CTE се състои основно от три неща:
-
анкерната
SELECTда започнем с; който може да избере напр. служителите на основно ниво (къдетоReports_Toе NULL), или може да избере произволен служител, който дефинирате, напр. по параметър -
a
UNION ALL -
рекурсивен
SELECTизраз, който избира от същата, обикновено самореферентна таблица и се свързва с рекурсивния CTE, който се изгражда в момента
Това ви дава възможност рекурсивно да изградите набор от резултати, от който след това да избирате.
Ако погледнете Northwind примерна база данни, тя има таблица, наречена Employees който се самореферира:Employees.ReportsTo --> Employees.EmployeeID определя кой на кого докладва.
Вашият CTE ще изглежда така:
;WITH RecursiveCTE AS
(
-- anchor query; get the CEO
SELECT EmployeeID, FirstName, LastName, Title, 1 AS 'Level', ReportsTo
FROM dbo.Employees
WHERE ReportsTo IS NULL
UNION ALL
-- recursive part; select next Employees that have ReportsTo -> cte.EmployeeID
SELECT
e.EmployeeID, e.FirstName, e.LastName, e.Title,
cte.Level + 1 AS 'Level', e.ReportsTo
FROM
dbo.Employees e
INNER JOIN
RecursiveCTE cte ON e.ReportsTo = cte.EmployeeID
)
SELECT *
FROM RecursiveCTE
ORDER BY Level, LastName
Не знам дали можете да преведете извадката си в правилен рекурсивен CTE - но това е основното:заявка за закрепване, UNION ALL, рекурсивна заявка