Vấn đề bạn sẽ phải đối mặt với đệ quy và hiệu suất là bao nhiêu lần nó sẽ phải recurse để trả lại kết quả. Mỗi cuộc gọi đệ quy là một cuộc gọi riêng biệt khác sẽ phải được kết hợp vào tổng số kết quả.
Trong SQL 2K5 bạn có thể sử dụng một biểu thức bảng chung để xử lý đệ quy này:
WITH Managers AS
(
--initialization
SELECT EmployeeID, LastName, ReportsTo
FROM Employees
WHERE ReportsTo IS NULL
UNION ALL
--recursive execution
SELECT e.employeeID,e.LastName, e.ReportsTo
FROM Employees e INNER JOIN Managers m
ON e.ReportsTo = m.employeeID
)
SELECT * FROM Managers
hoặc giải pháp khác là để san bằng hệ thống phân cấp vào một bảng khác
Employee_Managers
ManagerId (PK , FK tới bảng nhân viên)
EmployeeId (PK, FK tới bảng nhân viên)
Tất cả các tàu liên quan con mẹ sẽ được lưu trữ trong bảng này, vì vậy nếu quản lý 1 quản lý quản lý 2 quản lý nhân viên 3, bảng sẽ trông như thế:
ManagerId EmployeeId
1 2
1 3
2 1
Điều này cho phép phân cấp để dễ dàng truy vấn:
select * from employee_managers em
inner join employee e on e.employeeid = em.employeeid and em.managerid = 42
trong đó sẽ trả lại toàn bộ nhân viên có quản lý 42. các lộn ngược sẽ được hiệu suất cao hơn, nhưng nhược điểm là sẽ được duy trì hệ thống phân cấp
Tôi nghĩ vấn đề của ông là ông muốn "Tại một cấp độ cụ thể ". Trừ khi bạn lưu trữ số cấp, làm thế nào để bạn biết những gì là ở một mức độ cụ thể mà không đi root = cấp 1, trẻ em của root = cấp 2, trẻ em của trẻ em = cấp 3, vv ... Không phải đệ quy là cần thiết .. Nhưng có thể có nhiều cha mẹ. – Cervo