Come posso rilevare cui il soggetto rapporti di utilizzare una tabella dipendente autoreferenziale?
-
16-10-2019 - |
Domanda
Ho un tipico tavolo dipendente autoreferenziale. I dati sono gerarchico e io uso il seguente UDF per incapsulare un semplice CTE per ricavare una potenza di rapporti diretti e indiretti di una persona particolare. Vale a dire che posso passare in un solo dipendente e tornare un elenco di loro e tutti sotto di loro.
Voglio creare una funzione simile che mi avrebbe permesso di fare un capo e dipendente param e rilevare se i rapporti dei dipendenti in capo (o param capo è davvero il boss - diretta o indiretta del dipendente)
che cosa è il modo migliore per ottenere questo risultato logica utilizzando la struttura di DB indicato di seguito come quello che ho oggi?
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
)
Soluzione
Se si desidera solo per restituire un vero o falso sul confronto tra un dipendente e un manager, provate questo:
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
Altri suggerimenti
Poiché per me è già un problema ben noto e risolto, e dal momento che il commento qui sembra essere d'accordo con me:
https://stackoverflow.com/questions/3859882/sql-recursive-function -to-find-manager
Sei voler restituire i risultati per ogni dipendente più basso nel set, ed è quello che sta rendendo difficile?