2013-04-26 8 views
5

Ho una tabella Impiegato comeRicevi tutte dipendente che riferisce direttamente o indirettamente, a un dipendente, con livello di gerarchia senza

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 

voglio ottenere tutti i dipendenti che riporta direttamente o indirettamente a Sumanta o emp_id (1), e con il livello di gerarchia, in questo modo:

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

sono nuovo di SQL e proprio non riuscivo a trovare cosa usare o come ottenere questi risultati. Vale la pena memorizzare una procedura con una variabile valutata a livello, o solo una query di selezione Tsql sarà sufficiente. Qualsiasi aiuto è il benvenuto.

tutto ciò che ho fatto è-

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; 

ma questo è preciso fino a 2 livelli e smusso persino generare il hierarchy_level no. Qualsiasi suggerimento, idea ............ sarà più utile .........

risposta

9

Si potrebbe utilizzare una CTE ricorsiva:

; 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

Grazie .... Andomar. – Sukanta

+0

'Con CTE come ( Select emp_id, emp_Name, reports_to, 1 come Livello da emp dove reports_to = 1 Unione tutta Select E.emp_id, E.emp_name, E.reports_to, Livello + 1 da emp come E interno unisciti a CTE su E.reports_to = CTE.emp_id ) Seleziona * da CTE; ' Ho appena trovato esattamente quello che stavo cercando .... @Andomar Grazie – Sukanta

+0

Wow, non sapevo su SqlFiddle –

Problemi correlati