Se:
- SQL-server - Simpelt eksempel på en rekursiv CTE
- MSDN:Rekursive forespørgsler med almindeligt tabeludtryk
- SQL Server rekursiv CTE (dette ligner nogenlunde det, du arbejder på!)
Opdatering:
En ordentlig rekursiv CTE består grundlæggende af tre ting:
-
et anker
SELECT
til at starte med; der kan vælge f.eks. rodniveaumedarbejderne (hvorReports_To
er NULL), eller den kan vælge en hvilken som helst vilkårlig medarbejder, som du definerer, f.eks. med en parameter -
en
UNION ALL
-
en rekursiv
SELECT
sætning, der vælger fra den samme, typisk selvrefererende tabel og slutter sig til den rekursive CTE, der aktuelt bygges op
Dette giver dig mulighed for rekursivt at opbygge et resultatsæt, som du derefter kan vælge fra.
Hvis du ser på Northwind
eksempeldatabase, den har en tabel kaldet Employees
som er selvrefererende:Employees.ReportsTo --> Employees.EmployeeID
definerer, hvem der rapporterer til hvem.
Din CTE ville se nogenlunde sådan ud:
;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
Jeg ved ikke, om du kan oversætte din prøve til en ordentlig rekursiv CTE - men det er dybest set kernen i det:ankerforespørgsel, UNION ALL, rekursiv forespørgsel