2013-04-26 13 views
5

Tôi có một bảng Employee nhưNhận tất cả người lao động trực tiếp hoặc gián tiếp báo cáo cho một nhân viên, với mức phân cấp không

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 

Tôi muốn để có được tất cả các nhân viên trực tiếp hoặc gián tiếp báo cáo lên Sumanta hoặc emp_id (1) và với cấp phân cấp, như sau:

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

Tôi mới sử dụng SQL và không thể tìm thấy những gì cần sử dụng hoặc cách nhận các kết quả đó. Là nó có giá trị một thủ tục được lưu trữ với bảng có giá trị biến, hoặc chỉ là một truy vấn chọn Tsql sẽ là đủ. Bất kỳ trợ giúp nào được chào đón nhiều nhất.

Tất cả tôi đã làm là-

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; 

nhưng điều này là chính xác tối đa 2 cấp độ và tôi thậm chí không thể tạo ra hierarchy_level không. Bất kỳ đề nghị, ý tưởng ............ sẽ được hầu hết hữu ích .........

Trả lời

9

Bạn có thể sử dụng một CTE đệ quy:

; 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

Cảm ơn .... Andomar. – Sukanta

+0

'Với CTE như ( Chọn emp_id, emp_Name, reports_to, 1 như Cấp Từ emp đâu reports_to = 1 Liên minh tất cả Chọn E.emp_id, E.emp_name, E.reports_to, Cấp + 1 Từ emp như E Nội tham gia CTE trên E.reports_to = CTE.emp_id ) Chọn * từ CTE; ' Chỉ tìm thấy chính xác những gì tôi đang tìm kiếm .... @Andomar Cảm ơn – Sukanta

+0

Ồ, tôi không biết về SqlFiddle –

Các vấn đề liên quan