典型的な自己参照型の従業員テーブルがあります。データは階層的であり、次の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
)
従業員とマネージャーを比較したときにtrueまたはfalseを返すだけの場合は、次のことを試してください。
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
セット内の最下位の従業員ごとに結果を返したいと思っていますか?それが難しいのはなぜですか?