sql 循环递归
Recursion in sql with loop
我有一个table,
那里有用户,每个用户都有主管。然而,首席执行官没有主管,他是自己的主管。 (即 CEO 的 supervisiorid 是 CEO 的 UserId)
我需要查找给定用户 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 )
这会一直循环下去。
有什么建议吗?
只是限制递归部分排除where 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
我有一个table,
那里有用户,每个用户都有主管。然而,首席执行官没有主管,他是自己的主管。 (即 CEO 的 supervisiorid 是 CEO 的 UserId)
我需要查找给定用户 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 )
这会一直循环下去。
有什么建议吗?
只是限制递归部分排除where 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