SQL Server语言 - 具有附加 EXISTS 条件的递归 CTE



我遇到一种情况,我需要能够查看给定人员是否在用户/经理层次结构中。我有表格的下一个结构:用户标识用户名管理器标识

我有 2 个 ID

:一些用户 ID(比如 5 个)和管理器 ID(比如 2 个)。因此,我需要知道具有给定 ID (2) 的经理是否是具有给定 ID (5) 的用户的主要负责人?例如,如果

  1. 用户 1 向用户 2 报告。
  2. 用户 3 向用户 1 报告。
  3. 用户 4 向用户 3 报告

结果 SQL 查询必须显示,对于 UserId = 4 和 ManagerId = 1,答案为真。

我刚刚创建了用于获取所有层次结构的查询:

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

但是现在我不知道如何使用上述条件获取结果查询:(

提前感谢任何帮助!

在定位点中找到用户,然后沿着层次结构向上走。检查您在针对管理器的递归查询中获得的行。

这将返回经理行(如果存在)。

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
如果

存在,这将返回 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

我已经将所有级别的层次结构包含在 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-%' 

这是小提琴。 我使用了 UserId = 4 和 ManagerId = 1。

祝你好运。

最新更新