Как я могу обнаружить, кого человек отчитывается от использования таблицы работников самореализации?
-
16-10-2019 - |
Вопрос
У меня есть типичная таблица работников. Данные являются иерархическими, и я использую следующий UDF для инкапсуляции простого CTE, чтобы получить вывод прямых и косвенных отчетов конкретного человека. То есть я могу передать одним сотрудникам и вернуть их список и всех под ними.
Я хочу создать аналогичную функцию, которая позволила бы мне взять парамет босса и сотрудника и обнаружить, сообщает ли сотрудник в боссе (или босс, действительно является боссом - прямым или косвенным работником)
Как лучше всего выполнить эту логику, используя структуру БД, изложенную ниже, как то, что у меня есть сегодня?
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
)
Решение
Если вы просто хотите вернуть истинную или ложную после сравнения сотрудника и менеджера, попробуйте это:
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
Другие советы
Поскольку для меня это уже хорошо известная и решаемая проблема, и, поскольку комментарий здесь, кажется, согласен со мной:
https://stackoverflow.com/questions/3859882/sql-recurive-funct-to-find-managers
Вы хотите вернуть результаты для каждого самого низкого сотрудника в наборе, и это то, что затрудняет это?