2015-10-19 118 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 –