Siehe:
- SQL Server - Einfaches Beispiel eines rekursiven CTE
- MSDN:Rekursive Abfragen mit allgemeinem Tabellenausdruck
- Rekursiver SQL Server-CTE (Das scheint ziemlich genau das zu sein, woran Sie gerade arbeiten!)
Aktualisierung:
Ein richtiger rekursiver CTE besteht im Wesentlichen aus drei Dingen:
-
ein Anker
SELECT
zunächst; das kann z.b. die Mitarbeiter der Root-Ebene (wobei dieReports_To
ist NULL), oder es kann einen beliebigen Mitarbeiter auswählen, den Sie definieren, z. durch einen Parameter -
a
UNION ALL
-
eine rekursive
SELECT
Anweisung, die aus derselben, normalerweise selbstreferenzierenden Tabelle auswählt und mit dem rekursiven CTE verknüpft wird, der gerade aufgebaut wird
Dadurch haben Sie die Möglichkeit, rekursiv eine Ergebnismenge aufzubauen, aus der Sie dann auswählen können.
Wenn Sie sich den Northwind
ansehen Beispiel-Datenbank hat sie eine Tabelle namens Employees
die selbstreferenzierend ist:Employees.ReportsTo --> Employees.EmployeeID
legt fest, wer wem unterstellt ist.
Ihr CTE würde in etwa so aussehen:
;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
Ich weiß nicht, ob Sie Ihr Beispiel in einen richtigen rekursiven CTE übersetzen können - aber das ist im Grunde das Wesentliche:Ankerabfrage, UNION ALL, rekursive Abfrage