Viz:
- SQL Server – Jednoduchý příklad rekurzivního CTE
- MSDN:Rekurzivní dotazy pomocí Common Table Expression
- Rekurzivní CTE serveru SQL (toto vypadá přesně jako to, na čem pracujete!)
Aktualizace:
Správné rekurzivní CTE se skládá v podstatě ze tří věcí:
-
kotva
SELECT
začít s; která může vybrat např. zaměstnanci na kořenové úrovni (kdeReports_To
je NULL), nebo může vybrat libovolného zaměstnance, kterého definujete, např. parametrem -
a
UNION ALL
-
rekurzivní
SELECT
příkaz, který vybírá ze stejné, obvykle samoodkazující tabulky a spojuje se s rekurzivním CTE, který se právě vytváří
To vám dává možnost rekurzivně vytvořit sadu výsledků, ze které pak můžete vybírat.
Pokud se podíváte na Northwind
ukázková databáze, obsahuje tabulku nazvanou Employees
který odkazuje na sebe:Employees.ReportsTo --> Employees.EmployeeID
definuje, kdo se komu hlásí.
Vaše CTE by vypadalo nějak takto:
;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
Nevím, jestli dokážete přeložit svůj vzorek do správného rekurzivního CTE – ale to je v podstatě podstata:kotevní dotaz, UNION ALL, rekurzivní dotaz