2013-04-26 15 views
5

Ben doğrudan veya dolaylı Sumanta veya emp_id rapor tüm çalışanları almak istiyorumhiyerarşi seviyesi ile doğrudan ya da dolaylı olarak bir çalışanın rapor bütün çalışanın alın hiçbir

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 

gibi çalışan tablosundaki (1) ve bunun gibi hiyerarşi seviyesi ile:

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

Ben SQL için yeni ve adil kullanabilir veya nasıl bu sonuçları almak için ne bulamadık. Tablo değerli değişken ile saklı bir prosedür değer mi yoksa sadece bir Tsql select sorgusu yeterli olacaktır. Herhangi bir yardım en hoş geldiniz.

Tüm ben

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; 

IS- yapmış ama bu 2 düzeye kadar doğru olduğunu ve hatta hierarchy_level oluşturmak olamaz hayır. Herhangi bir öneri, fikir, ............

cevap

9

Şunları kullanabilirsiniz ......... bir özyinelemeli CTE en yararlı olacaktır:

; 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

Teşekkürler .... Andomar. CTE ile – Sukanta

+0

'( Seç emp_id, emp_name, reports_to olarak 1 emp itibaren Seviye olarak nerede reports_to = 1 Birliği E İç olarak emp itibaren tüm Seç E.emp_id, E.emp_name, E.reports_to, Seviye + 1 E.reports_to adresindeki CTE'ye katılın = CTE.emp_id ) CTE'den seçim yapın; ' Sadece aradığımı tam olarak buldum .... @Andomar Teşekkürler – Sukanta

+0

Wow, SqlFiddle hakkında bilgimiz yok. –

İlgili konular