Xem:
- Máy chủ SQL - Ví dụ đơn giản về CTE đệ quy
- MSDN:Truy vấn đệ quy sử dụng Biểu thức Bảng Chung
- CTE đệ quy của SQL Server (điều này có vẻ khá giống chính xác những gì bạn đang làm!)
Cập nhật:
Một CTE đệ quy thích hợp về cơ bản bao gồm ba điều:
-
một mỏ neo
SELECT
đầu tiên là; có thể chọn ví dụ:nhân viên cấp cơ sở (trong đóReports_To
là NULL), hoặc nó có thể chọn bất kỳ nhân viên tùy ý nào mà bạn xác định, ví dụ:bởi một tham số -
một
UNION ALL
-
một đệ quy
SELECT
câu lệnh chọn từ cùng một bảng, thường là bảng tự tham chiếu và kết hợp với CTE đệ quy hiện đang được xây dựng
Điều này cung cấp cho bạn khả năng tạo đệ quy một tập kết quả mà sau đó bạn có thể chọn từ đó.
Nếu bạn nhìn vào Northwind
cơ sở dữ liệu mẫu, nó có một bảng được gọi là Employees
tự tham chiếu:Employees.ReportsTo --> Employees.EmployeeID
xác định ai báo cáo cho ai.
CTE của bạn sẽ trông giống như sau:
;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
Tôi không biết liệu bạn có thể dịch mẫu của mình sang CTE đệ quy thích hợp hay không - nhưng về cơ bản đó là ý chính của nó: truy vấn neo, UNION ALL, truy vấn đệ quy