自己参照従業員テーブルを使用して、その人の直属先を検出するにはどうすればよいですか?

dba.stackexchange https://dba.stackexchange.com/questions/1137

質問

典型的な自己参照従業員テーブルがあります。データは階層的であり、次の UDF を使用して単純な CTE をカプセル化し、特定の個人の直接および間接的な部下の出力を取得します。つまり、1 人の従業員を渡すと、その従業員とその配下全員のリストを取得できます。

上司と従業員のパラメータを取得し、従業員が上司に直属しているかどうか(または、上司パラメータが実際に従業員の直接または間接的な上司であるかどうか)を検出できる同様の関数を作成したいと考えています。

現在私が持っているものとして、以下に概要を説明する 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