带循环的sql中的递归

带循环的sql中的递归,sql,sql-server,recursive-query,Sql,Sql Server,Recursive Query,我有一张桌子 有用户且每个用户都有监督者。然而,首席执行官没有一个监管者,他是自己的监管者。(即CEO的SupervisorID是CEO的用户ID) 我需要找到给定用户ID下所有下属的列表。我使用下面的查询 WITH CTE_EMPLOYEE_HEIRARCHY AS ( SELECT E.UserId, E.SupervisiorId AS Supervisor, d.DepartmentName,d.DepartmentId FROM T_BIT_Users E with

我有一张桌子

有用户且每个用户都有监督者。然而,首席执行官没有一个监管者,他是自己的监管者。(即CEO的SupervisorID是CEO的用户ID)

我需要找到给定用户ID下所有下属的列表。我使用下面的查询

WITH CTE_EMPLOYEE_HEIRARCHY AS
(
    SELECT E.UserId, E.SupervisiorId AS Supervisor, d.DepartmentName,d.DepartmentId
    FROM T_BIT_Users  E with (nolock) inner join T_BIT_Department d with (nolock) on d.DepartmentId=e.DepartmentId  WHERE E.UserId = 13

    UNION ALL

    SELECT E1.UserId,  E1.SupervisiorId  AS Supervisor,d.DepartmentName,d.DepartmentId
    FROM CTE_EMPLOYEE_HEIRARCHY  
    JOIN T_BIT_Users E1 
    ON E1.SupervisiorId = CTE_EMPLOYEE_HEIRARCHY.UserId
       inner join T_BIT_Department d on d.DepartmentId=e1.DepartmentId)
SELECT  * FROM CTE_EMPLOYEE_HEIRARCHY
OPTION  ( MAXRECURSION 0 )
这将永远保持循环


有什么建议吗?

只需将递归部分限制为排除在
supervisorId=userId

SELECT E1.UserId,  E1.SupervisiorId  AS Supervisor,d.DepartmentName,d.DepartmentId
FROM CTE_EMPLOYEE_HEIRARCHY  
JOIN T_BIT_Users E1 
ON E1.SupervisiorId = CTE_EMPLOYEE_HEIRARCHY.UserId
   inner join T_BIT_Department d on d.DepartmentId=e1.DepartmentId
WHERE E1.SupervisorId != E1.UserId # <-- here
选择E1.UserId、E1.SupervisiorId作为主管、d.DepartmentName、d.DepartmentId
来自CTE_员工_继承人
加入T_位_用户E1
在E1.supervisorid=CTE_EMPLOYEE_hierarchy.UserId上
d.DepartmentId=e1.DepartmentId上的内部连接T\u位\u部门d

其中E1.SupervisorId!=E1.UserId#如何使用示例数据创建?我试过了,成功了。然而,我不知道确切的语法mysql@AmitKumar作为将来的参考,SQLFIDLE允许您更改左上角的RDM,也就是说,您可以让SQLFIDLE使用mssql服务器。请注意这一点。谢谢你JamiecI我也需要主管(传递的用户ID)。@AmitKumar这是CTE查询的第一部分,对吗
其中E.UserId=13
是的,我正在传递UserId