Проблема с рекурсией и производительностью, с которой вы столкнетесь, состоит в том, сколько раз ему придется повторяться, чтобы вернуть результаты. Каждый рекурсивный вызов - это еще один отдельный вызов, который необходимо объединить в общие результаты.
В SQL 2k5 вы можете использовать общее табличное выражение для обработки этой рекурсии:
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
или другое решение - объединить иерархию в другую таблицу
Employee_Managers
ManagerId (ПК, FK для таблицы сотрудников)
EmployeeId (PK, FK для таблицы Employee)
Все родительские дочерние корабли будут храниться в этой таблице, поэтому, если Менеджер 1 управляет Менеджером 2, управляет сотрудником 3, таблица будет выглядеть так:
ManagerId EmployeeId
1 2
1 3
2 1
Это позволяет легко запрашивать иерархию:
select * from employee_managers em
inner join employee e on e.employeeid = em.employeeid and em.managerid = 42
Что вернет всех сотрудников, у которых есть менеджер 42. Потенциалом будет повышение производительности, но недостатком будет поддержание иерархии