2013-04-26 13 views
5

Mam tabeli Employee jakuzyskać wszystkie pracownika, który bezpośrednio lub pośrednio zgłosi się do pracownika, z poziomu hierarchii nie

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 

chcę uzyskać wszystkich pracowników, które bezpośrednio lub pośrednio raporty do Sumanta lub emp_id (1), a także z poziomu hierarchii, na przykład:

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

Jestem nowy w SQL i po prostu nie mógł znaleźć to, czego używać i jak uzyskać te wyniki. Czy warto jest procedura przechowywana ze zmienną o wartości tabela, lub wystarczy kwerendy wybierania Tsql będzie wystarczające. Każda pomoc jest mile widziana.

Wszystko zrobiłem IS-

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; 

ale to dokładne września 2 poziomie i nie mogę nawet wygenerować hierarchy_level nie. Wszelkie sugestie, pomysł ............ będą najbardziej pomocne .........

Odpowiedz

9

Można użyć rekurencyjnej 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

Dzięki .... Andomar. – Sukanta

+0

„Z CTE jako ( Wybierz emp_id, emp_name, reports_to, 1 jako poziom Od emp gdzie reports_to = 1 Unia wszystko Wybierz E.emp_id, E.emp_name, E.reports_to, poziom + 1 Z EMP jako E Wewnętrznych dołącz do CTE na E.reports_to = CTE.emp_id ) Wybierz * z CTE; ' Wystarczy znaleźć dokładnie to, czego szukałem .... @Andomar Dzięki – Sukanta

+0

Wow, nie wiedziałem o SqlFiddle –

Powiązane problemy