Lihat:
- SQL Server - Contoh sederhana CTE rekursif
- MSDN:Kueri Rekursif menggunakan Ekspresi Tabel Umum
- SQL Server rekursif CTE (ini sepertinya persis seperti yang sedang Anda kerjakan!)
Pembaruan:
CTE rekursif yang tepat pada dasarnya terdiri dari tiga hal:
-
sebuah jangkar
SELECT
memulai dengan; yang dapat memilih mis. karyawan tingkat akar (di manaReports_To
adalah NULL), atau dapat memilih karyawan sewenang-wenang yang Anda tetapkan, mis. dengan parameter -
sebuah
UNION ALL
-
sebuah rekursif
SELECT
pernyataan yang memilih dari tabel referensi diri yang sama dan biasanya bergabung dengan CTE rekursif yang sedang dibangun
Ini memberi Anda kemampuan untuk secara rekursif membangun kumpulan hasil yang kemudian dapat Anda pilih.
Jika Anda melihat Northwind
contoh database, memiliki tabel yang disebut Employees
yang mengacu pada diri sendiri:Employees.ReportsTo --> Employees.EmployeeID
mendefinisikan siapa melapor kepada siapa.
CTE Anda akan terlihat seperti ini:
;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
Saya tidak tahu apakah Anda dapat menerjemahkan sampel Anda ke CTE rekursif yang tepat - tetapi pada dasarnya itulah intinya:kueri jangkar, UNION ALL, kueri rekursif