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
SELECT
till 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
SELECT
uttalande 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