Se:
- SQL-server - Enkelt exempel på en rekursiv CTE
- MSDN:Rekursiva frågor med vanligt tabelluttryck
- SQL Server rekursiv CTE (det här verkar ungefär som exakt det du jobbar med!)
Uppdatering:
En riktig rekursiv CTE består i princip av tre saker:
-
ett ankare
SELECTtill att börja med; som kan välja t.ex. rotnivåanställda (därReports_Toär NULL), eller så kan den välja valfri godtycklig anställd som du definierar, t.ex. med en parameter -
en
UNION ALL -
en rekursiv
SELECTuttalande som väljer från samma, vanligtvis självrefererande tabell och ansluter till den rekursiva CTE som för närvarande byggs upp
Detta ger dig möjligheten att rekursivt bygga upp en resultatuppsättning som du sedan kan välja från.
Om du tittar på Northwind exempeldatabas, den har en tabell som heter Employees som är självrefererande:Employees.ReportsTo --> Employees.EmployeeID definierar vem som rapporterar till vem.
Din CTE skulle se ut ungefär så här:
;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
Jag vet inte om du kan översätta ditt prov till en riktig rekursiv CTE - men det är i grunden kärnan i det:ankarfråga, UNION ALL, rekursiv fråga