2013-04-26 39 views
5

我有一個Employee表像獲取所有的員工誰直接或間接地報告給員工,以層級沒有

emp_id bigint, 
reports_to bigint, 
emp_name varchar(20), 
Constraint [PK_Emp] Primary key (emp_id), 
Constraint [FK_Emp] Foreign key (reports_to) references [MSS].[dbo].[Emp]([emp_id]) 

emp_id   reports_to  emp_name 
------   ------  -------------- 
1    null   Sumanta 
2    1   Arpita 
3    null   Pradip 
4    1   Sujon 
5    2   Arpan 
6    5   Jayanti 

我想所有直接或間接地報告給Sumanta或EMP_ID員工(1 ),並與層級,就像這樣:

emp_id   hierarchy_level   emp_name 
------   ---------------  ---------- 
2     1     Arpita 
4     1     Sujon 
5     2     Arpan 
6     3     Jayanti 

我新的SQL,只是找不到用什麼或如何得到這些結果。值得使用表值變量的存儲過程,還是隻需要一個Tsql select查詢就足夠了。任何幫助是最受歡迎的。

我所做的是 -

Select Ep.emp_id,ep.emp_eame 
From Emp as E 
Inner Join Emp as Ep on Ep.reports_to=E.Emp_id 
Where E.reports_to=1 or E.emp_id=1; 

但這是正確的高達2級,我甚至不能產生hierarchy_level沒有。 任何建議,想法............將是最有幫助.........

回答

9

你可以使用遞歸CTE:

; with CTE as 
     (
     select emp_id 
     ,  reports_to 
     ,  emp_name 
     ,  1 as level 
     from Emp 
     where emp_name = 'Sumanta' 
     union all 
     select child.emp_id 
     ,  child.reports_to 
     ,  child.emp_name 
     ,  level + 1 
     from Emp child 
     join CTE parent 
     on  child.reports_to = parent.emp_id 
     ) 
select * 
from CTE 

Example at SQL Fiddle.

+0

謝謝.... Andomar。 – Sukanta 2013-04-26 14:10:24

+0

「隨着CTE爲( 選擇emp_id,EMP_NAME,的Reports_To,1爲Level 從EMP其中的Reports_To = 1 聯盟所有 選擇E.emp_id,E.emp_name,E.reports_to,等級+ 1 FROM EMP爲E 內加入CTE on E.reports_to = CTE.emp_id ) Select * from CTE;' 剛剛發現正是我一直在尋找.... @Andomar 感謝 – Sukanta 2013-04-26 14:12:15

+0

哇,我不知道SqlFiddle – 2013-04-26 14:24:11

相關問題