3

特定の人物がユーザー/マネージャー階層内にあるかどうかを確認できる必要がある状況があります。私はテーブルの次の構造を持っています: UserId UserName ManagerId

UserId (たとえば 5) と ManagerId (たとえば 2) の 2 つの ID があります。その結果、指定された ID (2) を持つマネージャーが、指定された ID (5) を持つユーザーのチーフであるかどうかを知る必要がありますか? たとえば、

  1. ユーザー 1 はユーザー 2 に報告します。
  2. ユーザー 3 はユーザー 1 に報告します。
  3. ユーザー 4 はユーザー 3 にレポートします

結果の SQL クエリは、UserId = 4 および ManagerId = 1 の回答が true であることを示す必要があります。

すべての階層を取得するためのクエリを作成しました。

WITH temp (level, UserName, UserId, ManagerId) AS
(
  SELECT 1 AS level, EmployeeName, EmployeeId, BossId
  FROM Employees
  WHERE BossId IS NULL

  UNION ALL

  SELECT level+1 AS level, EmployeeName, EmployeeId, BossId
  FROM Employees, temp
  WHERE BossId = UserId
)

SELECT t.* from temp AS t

しかし、今では上記の条件で結果クエリを取得する方法がわかりません:(

助けてくれてありがとう!

4

3 に答える 3

3

アンカーでユーザーを見つけて、階層を上に戻ります。マネージャーに対する再帰クエリで取得した行を確認します。

これは、マネージャー行が存在する場合にそれを返します。

WITH temp AS
(
  SELECT EmployeeName, EmployeeId, BossId
  FROM Employees
  WHERE EmployeeId = @UserID

  UNION ALL

  SELECT E.EmployeeName, E.EmployeeId, E.BossId
  FROM Employees AS E
    inner join temp AS T
      ON E.EmployeeId = T.BossId
)

SELECT * 
FROM temp
WHERE EmployeeId = @ManagerID
于 2013-02-02T21:52:49.473 に答える
0

すべてのレベルの階層を CTE に含めました。これを使用してクエリを実行できます。この階層を使用すると、特定の従業員のすべてのマネージャーを区切られた列に表示できます (他の計算に役立つ場合があります)。

これを試してください:

WITH cte (UserId, ManagerId, Level, Hierarchy) as (
   SELECT EmployeeId, BossId, 0, CAST(EmployeeId as nvarchar)
   FROM Employee
   WHERE BossId IS NULL 
   UNION ALL
   SELECT EmployeeId, BossId, Level+1, 
      CAST(cte.Hierarchy + '-' + CAST(EmployeeId as nvarchar) as nvarchar)
   FROM Employee INNER JOIN cte ON Employee.BossId=cte.UserId 
)
SELECT * 
FROM cte
WHERE UserId = 4 
  AND '-' + Hierarchy LIKE '%-1-%' 

そして、ここにFiddleがあります。UserId = 4 と ManagerId = 1 を使用しました。

幸運を。

于 2013-02-02T22:03:54.110 に答える
0

彼または彼女が存在する場合、これは BossID を返します。

WITH BOSSES AS 
(
    SELECT BossID
    FROM Employees
    WHERE EmployeeID = @uID

    UNION ALL

    SELECT E.BossID
    FROM Employees E 
    JOIN BOSSES B ON E.EmployeeID = B.BossID
)
SELECT *
FROM BOSSES 
WHEN BossID = @bID
于 2013-02-02T22:16:54.607 に答える