Zie:
- SQL-server - Eenvoudig voorbeeld van een recursieve CTE
- MSDN:recursieve query's met Common Table Expression
- SQL Server recursieve CTE (dit lijkt ongeveer precies waar je aan werkt!)
Bijwerken:
Een goede recursieve CTE bestaat in wezen uit drie dingen:
-
een anker
SELECT
beginnen met; die kan selecteren b.v. de medewerkers op rootniveau (waar deReports_To
is NULL), of het kan elke willekeurige werknemer selecteren die u definieert, b.v. door een parameter -
een
UNION ALL
-
een recursieve
SELECT
statement dat selecteert uit dezelfde, typisch zelfverwijzende tabel en aansluit bij de recursieve CTE die momenteel wordt opgebouwd
Dit geeft je de mogelijkheid om recursief een resultatenset op te bouwen waaruit je kunt kiezen.
Als je kijkt naar de Northwind
voorbeelddatabase, het heeft een tabel met de naam Employees
wat naar zichzelf verwijst:Employees.ReportsTo --> Employees.EmployeeID
bepaalt wie aan wie rapporteert.
Uw CTE ziet er ongeveer zo uit:
;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
Ik weet niet of u uw voorbeeld kunt vertalen naar een correcte recursieve CTE - maar dat is eigenlijk de essentie:ankerquery, UNION ALL, recursieve zoekopdracht