Comment puis-je détecter qui un rapport de personne à l'aide d'une table des employés auto-référencement?
-
16-10-2019 - |
Question
J'ai une table des employés auto-référencement typique. Les données est hiérarchique et j'utiliser l'UDF suivante pour encapsuler un CTE simple à obtenir une production de rapports directs et indirects d'une personne en particulier. C'est-à-dire que je peux passer dans un seul employé et obtenez une liste d'entre eux et tout le monde sous eux.
Je veux créer une fonction similaire qui me permettrait de prendre un patron et l'employé param et détecter si l'employé dans le patron (ou le patron PARAM est en effet le patron - direct ou indirect de l'employé)
Quelle est la meilleure façon d'accomplir cette logique en utilisant la structure DB décrit ci-après ce que je aujourd'hui?
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
)
La solution
Si vous voulez juste retourner un vrai ou faux en comparant un employé et un gestionnaire, essayez ceci:
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
Autres conseils
Depuis pour moi, il est déjà un problème bien connu et résolu, et que le commentaire ici semble être d'accord avec moi:
https://stackoverflow.com/questions/3859882/sql-recursive-function -À-FIND-gestionnaires
Êtes-vous désireux de retourner les résultats pour chaque employé le plus bas dans l'ensemble, et c'est ce qui rend difficile?