Problemem będzie zmierzyć z rekursji i wydajność jest to, ile razy będzie musiał wrócić recurse wyniki. Każde wywołanie rekurencyjne jest kolejnym oddzielnym wywołaniem, które będzie musiało zostać połączone w całość wyników.
W SQL 2K5 można korzystać ze wspólnego wyrażenia stół do obsługi tej rekurencji:
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
lub innym rozwiązaniem jest spłaszczenie hierarchii w innej tabeli
Employee_Managers
ManagerId (PK , FK do tabeli pracownika)
EmployeeId (PK, FK do tabeli pracownika)
Wszystkie rodzic dziecko statki kadrowe będą przechowywane w tabeli, więc jeśli Menedżer 1 zarządza Manager 2 zarządza pracownikowi 3, tabela będzie wyglądać następująco:
ManagerId EmployeeId
1 2
1 3
2 1
Pozwala to hierarchia być łatwo zapytał:
select * from employee_managers em
inner join employee e on e.employeeid = em.employeeid and em.managerid = 42
który powróci wszystkich pracowników, które mają menedżera 42. Plusem będzie większa wydajność, ale minusem będzie utrzymanie hierarchii
Myślę, że jego problemem jest to, że chce „W szczególny poziom ". Jeśli nie przechowujesz numeru poziomu, skąd wiesz, co jest na danym poziomie, bez przechodzenia na poziom root = 1, dzieci root = poziom 2, dzieci dzieci = poziom 3, itd. Nie jest potrzebna rekursja. . Ale może być wielu rodziców. – Cervo