Das Problem, dem Sie bei Rekursion und Leistung gegenüberstehen werden, ist, wie viele Male sie rekursiv sein müssen, um die Ergebnisse zurückzugeben. Jeder rekursive Aufruf ist ein weiterer separater Aufruf, der in die Gesamtergebnisse einbezogen werden muss.
In SQL 2k5 können Sie eine CTE verwenden, um diese Rekursion zu behandeln:
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
Oder eine andere Lösung ist, die Hierarchie in eine andere Tabelle zu überführen.
Employee_Managers
ManagerId (PK, FK für Employee-Tabelle)
EmployeeId (PK, FK für Employee-Tabelle)
Alle Eltern-Kind-Beziehungen werden in dieser Tabelle gespeichert, so dass, wenn Manager 1 Manager 2 Mitarbeiter 3 verwaltet, die Tabelle wie folgt aussieht:
ManagerId EmployeeId
1 2
1 3
2 1
Dies ermöglicht es, die Hierarchie einfach abzufragen:
select * from employee_managers em
inner join employee e on e.employeeid = em.employeeid and em.managerid = 42
Das würde alle Mitarbeiter zurückgeben, die Manager 42 haben. Der Vorteil wird eine höhere Leistung sein, aber der Nachteil wird die Wartung der Hierarchie sein