自己参照従業員テーブルを使用して、その人の直属先を検出するにはどうすればよいですか?
-
16-10-2019 - |
質問
典型的な自己参照従業員テーブルがあります。データは階層的であり、次の 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
セット内の最下位の各従業員の結果を返したいと考えていますが、それが困難を引き起こしているのでしょうか?
所属していません dba.stackexchange