Zobacz:
- SQL Server — Prosty przykład rekurencyjnego CTE
- MSDN:zapytania rekurencyjne przy użyciu wspólnego wyrażenia tabeli
- Rekursywne CTE SQL Server (wygląda na to, nad czym pracujesz!)
Aktualizacja:
Właściwe rekurencyjne CTE składa się z trzech rzeczy:
-
kotwica
SELECT
najpierw; które mogą wybrać m.in. pracownicy na poziomie głównym (gdzieReports_To
ma wartość NULL) lub może wybrać dowolnego określonego pracownika, np. przez parametr -
a
UNION ALL
-
rekurencyjny
SELECT
instrukcja, która wybiera z tej samej, zazwyczaj odwołującej się do siebie tabeli i łączy się z aktualnie budowanym rekurencyjnym CTE
Daje to możliwość rekursywnego tworzenia zestawu wyników, z którego można następnie wybierać.
Jeśli spojrzysz na Northwind
przykładowa baza danych, zawiera tabelę o nazwie Employees
który jest samoodnoszący się:Employees.ReportsTo --> Employees.EmployeeID
określa kto komu podlega.
Twoje CTE wyglądałoby mniej więcej tak:
;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
Nie wiem, czy możesz przetłumaczyć swoją próbkę na właściwe rekurencyjne CTE - ale to w zasadzie sedno:zapytanie zakotwiczające, UNION ALL, zapytanie rekurencyjne