El problema que se enfrentará con la recursividad y el rendimiento es el número de veces que tendrá que recursivo para devolver los resultados. Cada llamada recursiva es otra llamada separada que deberá unirse en los resultados totales.
En SQL 2K5 puede utilizar una expresión de tabla común para manejar esta recursividad:
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
u otra solución es aplanar la jerarquía en una otra mesa
Employee_Managers
ManagerID (PK , FK a la tabla de empleados)
EmployeeId (PK, FK en la tabla de empleados)
Todos los barcos de relación entre padres e hijos serían almacenados en esta tabla, por lo que si el Administrador de 1 gestiona Manager 2 gestiona empleado 3, la tabla se vería así:
ManagerId EmployeeId
1 2
1 3
2 1
Esto permite que la jerarquía para ser fácilmente consultada:
select * from employee_managers em
inner join employee e on e.employeeid = em.employeeid and em.managerid = 42
cual se devolvía a todos los empleados que tienen gestor de 42. la ventaja será mayor rendimiento, pero la baja se va a mantener la jerarquía
Creo que su problema es que quiere "En un nivel particular ". A menos que almacene el número de nivel, ¿cómo sabe qué hay en un nivel particular sin ir a raíz = nivel 1, hijos de raíz = nivel 2, hijos de niños = nivel 3, etc ... No es necesario recursividad ... .Pero puede haber múltiples padres. – Cervo