Wie kann ich feststellen, wen eine Person eine Selbstreferenzentabelle nutzt?
-
16-10-2019 - |
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
)
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?