2015-10-19 88 views
0

我有一个表,sql中的递归循环

哪里有用户,他们每个人都有监督。然而,首席执行官没有监督员,他是自己的监督员。 (即,首席执行官的总监是CEO的UserId)

我有一个要求,查找给定userid下所有下属的列表。我正在使用下面的查询。

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) 

这会一直持续在循环中。

有什么建议。?

+0

怎么样和样品数据创建http://sqlfiddle.com? – lad2025

+0

http://sqlfiddle.com/#!9/2d4a6/1我试过了,做出来了。但是我不知道mysql中的确切语法 –

+0

@AmitKumar供将来参考sqlfiddle允许您在左上角更改RDMS,也就是说,您可以让您的sqlfiddle使用mssql服务器 – Jamiec

回答

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 
+0

我也需要主管(传递userId)。 –

+0

@AmitKumar尽管在CTE查询的第一部分,对不对? 'WHERE E.UserId = 13' < - 我认为这部分是你传递ID的地方 – Jamiec

+0

是的,我通过userId –