Вижте:
- 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, рекурсивна заявка