¿Cómo puedo detectar quienes una persona informa a la utilización de una tabla empleado referencia a sí misma?
-
16-10-2019 - |
Pregunta
Tengo una tabla de empleados de autorreferencia típico. El dato es jerárquica y utilizo el siguiente UDF para encapsular un CTE sencilla de obtener una producción de informes directos e indirectos de una persona en particular. Es decir me puede pasar en un solo empleado y volver a una lista de ellos y todo el mundo en virtud de ellos.
Quiero crear una función similar que permita que tome un jefe y empleado parámetro y detectar si el empleado se reporta en el jefe (o el parámetro jefe es de hecho el jefe - directa o indirecta del empleado)
¿Cuál es la mejor manera de lograr esta lógica usando la estructura de base de datos como se indica a continuación lo que tengo hoy?
CREATE TABLE [dbo].[Employees](
[EmployeeId] [int] NOT NULL,
[managerId] [int] NULL,
[FirstName] [nvarchar](50) NOT NULL,
[LastName] [nvarchar](50) NOT NULL,
[FullName] [nvarchar](100) NOT NULL,
[CorpEmailAddress] [nvarchar](510) NULL
) ON [PRIMARY]
ALTER FUNCTION [dbo].[fnGetEmployeeHierarchy]
(
@EmployeeId int = null
)
RETURNS TABLE
AS
RETURN
(
WITH yourcte AS
(
SELECT EmployeeId, ManagerID, AMRSNTID, FullName--, Name
FROM Employees
WHERE EmployeeId = isnull(@EmployeeId,EmployeeId)
UNION ALL
SELECT e.EmployeeId, e.ManagerID, e.AMRSNTID, e.FullName--, e.Name
FROM Employees e
JOIN yourcte y ON e.ManagerID = y.EmployeeId
)
SELECT EmployeeId, ManagerID, AMRSNTID, FullName--, Name
FROM yourcte
)
Solución
If you just want to return a true or false upon comparing an employee and a manager, try this:
CREATE FUNCTION [dbo].[fnGetEmployeeHierarchy]
(
@EmployeeId INT,
@ManagerId INT
)
RETURNS BIT
AS
BEGIN
DECLARE @return BIT;
SET @return = 0;
WITH yourcte AS
(
SELECT
EmployeeId,
ManagerID,
FullName
FROM Employees
WHERE EmployeeId = @EmployeeId
UNION ALL
SELECT
e.EmployeeId,
e.ManagerID,
e.FullName
FROM Employees e
INNER JOIN yourcte y
ON e.EmployeeId = y.ManagerId
)
SELECT
@return = 1
FROM yourcte
WHERE EmployeeId = @ManagerId;
RETURN @return;
END
Otros consejos
Since to me it's already a well known and solved problem, and since the commentary on here seems to agree with me:
https://stackoverflow.com/questions/3859882/sql-recursive-function-to-find-managers
Are you wanting to return the results for each lowest employee in the set, and that's what's making it hard?