Das Problem, das Sie mit Rekursion und Performance konfrontiert wird, ist, wie oft es Rekursion müssen die Ergebnisse zurück. Jeder rekursive Aufruf ist ein weiterer separater Aufruf, der zu den Gesamtergebnissen hinzugefügt werden muss.
In SQL 2K5 Sie eine gemeinsame Tabelle Ausdruck verwenden können diese Rekursion zu behandeln:
ist
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, die Hierarchie in einer anderen Tabelle
MANAGERID (PK
Employee_Managers abzuflachen , FK zur Mitarbeitertabelle)
EmployeeId (PK, FK zur Mitarbeitertabelle)
die Eltern-Kind Alle Beziehung Schiffe würden in dieser Tabelle gespeichert werden, so dass, wenn Manager-1 verwaltet Manager 2 verwaltet Mitarbeiter 3, würde die Tabelle wie folgt aussehen:
ManagerId EmployeeId
1 2
1 3
2 1
Dies ermöglicht die Hierarchie leicht abgefragt werden:
select * from employee_managers em
inner join employee e on e.employeeid = em.employeeid and em.managerid = 42
, die alle Mitarbeiter zurückkehren würde, die Manager haben 42. Der Kopf mehr Leistung sein wird, aber Nachteil der Hierarchie
Ich denke, sein Problem ist, er will „Bei ein bestimmtes Niveau ". Wenn Sie nicht wissen, was auf einer bestimmten Ebene ist, ohne root = level 1, root = level 2, children = level 3, etc ... Nicht, dass Rekursion benötigt wird. Aber es kann mehrere Eltern geben. – Cervo