Oracle
 sql >> Database >  >> RDS >> Oracle

Trova l'intero albero dalla radice che fornisce qualsiasi nodo

Devi prima attraversare l'albero per ottenere tutti i manager, quindi scendere per recuperare tutti i dipendenti:

select level, employee_id, last_name, manager_id ,
       connect_by_root employee_id as root_id
   from employees
connect by prior employee_id = manager_id -- down the tree
start with manager_id in ( -- list up the tree
     select manager_id 
       from employees
     connect by employee_id = prior manager_id -- up the tree
     start with employee_id = 101
     )
;

Vedi http://www.sqlfiddle.com/#!4/d15e7/18

Modifica:

Se il nodo specificato potrebbe anche essere il nodo radice, estendi la query per includere il nodo specificato nell'elenco dei nodi principali:

Esempio per nodo non root:

select distinct employee_id, last_name, manager_id 
   from employees
connect by prior employee_id = manager_id -- down the tree
start with manager_id in ( -- list up the tree
     select manager_id 
       from employees
     connect by employee_id = prior manager_id -- up the tree
     start with employee_id = 101
     union 
     select manager_id -- in case we are the root node
       from employees
     where manager_id = 101
     )
;

Esempio per nodo radice:

select distinct employee_id, last_name, manager_id 
   from employees
connect by prior employee_id = manager_id -- down the tree
start with manager_id in ( -- list up the tree
     select manager_id 
       from employees
     connect by employee_id = prior manager_id -- up the tree
     start with employee_id = 100
     union 
     select manager_id -- in case we are the root node
       from employees
     where manager_id = 100
     )
;

Fiddle su http://www.sqlfiddle.com/#!4/d15e7/32