Sql server 具有附加条件的递归CTE?

Sql server 具有附加条件的递归CTE?,sql-server,common-table-expression,recursive-query,Sql Server,Common Table Expression,Recursive Query,我有一种情况,我需要能够看到给定的人是否在用户/经理层次结构中。 我有表格的下一个结构: 用户ID 用户名 马格里德 我有两个ID:一些UserId(比如5)和ManagerId(比如2)。因此,我需要知道具有给定Id(2)的经理是否是具有给定Id(5)的用户的主管?例如,如果 用户1向用户2报告 用户3向用户1报告 用户4向用户3报告 SQL查询的结果必须显示,对于UserId=4和ManagerId=1,答案为true 我刚刚创建了用于获取所有层次结构的查询: WITH temp (leve

我有一种情况,我需要能够看到给定的人是否在用户/经理层次结构中。 我有表格的下一个结构: 用户ID 用户名 马格里德

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

  • 用户1向用户2报告
  • 用户3向用户1报告
  • 用户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
    
    但现在我不知道如何在上述条件下得到结果查询:(


    提前感谢您的帮助!

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

    如果存在管理器行,则返回该行

    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
    

    我在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


    祝你好运。

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

    “存在”是什么意思?对不起,当然存在。