带循环的sql中的递归
我有一张桌子 有用户且每个用户都有监督者。然而,首席执行官没有一个监管者,他是自己的监管者。(即CEO的SupervisorID是CEO的用户ID) 我需要找到给定用户ID下所有下属的列表。我使用下面的查询带循环的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
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