我如何检测一个人报告使用自我引用员工表的人?
-
16-10-2019 - |
题
我有一个典型的自我引用员工表。数据是分层的,我使用以下UDF封装简单的CTE来得出特定人的直接和间接报告的输出。也就是说,我可以通过一名员工,并恢复他们和他们下面的每个人的清单。
我想创建一个类似的功能,该功能使我能够接管老板和员工参数,并检测员工是否向老板报告(或者Boss Param确实是老板 - 员工的直接或间接)
使用下面概述的DB结构来完成此逻辑的最佳方法是我今天所概述的?
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-recursive-function-to-find-managers
您是否想返回该集合中每个最低员工的结果,这就是使它变得困难的原因?
不隶属于 dba.stackexchange