我有一个典型的自我引用员工表。数据是分层的,我使用以下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

您是否想返回该集合中每个最低员工的结果,这就是使它变得困难的原因?

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top