Comment puis-je détecter qui un rapport de personne à l'aide d'une table des employés auto-référencement?

dba.stackexchange https://dba.stackexchange.com/questions/1137

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  
)
Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top