Frage

Ich habe eine typische Selbstreferenzungstabelle. Die Daten sind hierarchisch und ich verwende das folgende UDF, um einen einfachen CTE zu verkörpern, um eine Ausgabe der direkten und indirekten Berichte einer bestimmten Person abzuleiten. Das heißt, ich kann einen einzelnen Mitarbeiter übergeben und eine Liste von ihnen und allen darunter zurückbekommen.

Ich möchte eine ähnliche Funktion erstellen, die es mir ermöglicht, einen Boss- und Mitarbeiterparam zu übernehmen und festzustellen, ob der Mitarbeiter in den Chef berichtet (oder der Boss -Param ist in der Tat der Boss - direkt oder indirekt des Mitarbeiter).

Was ist der beste Weg, um diese Logik mithilfe der unten beschriebenen DB -Struktur als das, was ich heute habe, zu erreichen?

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  
)
War es hilfreich?

Lösung

Wenn Sie beim Vergleich eines Mitarbeiters und eines Managers nur ein wahres oder falsches Vergleich zurückgeben möchten, versuchen Sie Folgendes:

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

Andere Tipps

Seit mir ist es für mich bereits ein bekanntes und gelöstes Problem, und da der Kommentar hier hier zu übereinstimmt, stimmt mir zu stimmen:

https://stackoverflow.com/questions/3859882/sql-recursive-function-to-find-manager

Möchten Sie die Ergebnisse für jeden niedrigsten Mitarbeiter im Set zurückgeben, und das macht es schwierig?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top