Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Suchen Sie den gesamten Baum von der Wurzel aus und geben Sie einen beliebigen Knoten an

Sie müssen zuerst den Baum nach oben durchqueren, um alle Manager zu erhalten, und dann nach unten, um alle Mitarbeiter abzurufen:

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
     )
;

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

Bearbeiten:

Wenn der angegebene Knoten auch der Wurzelknoten sein könnte, erweitern Sie die Abfrage, um den angegebenen Knoten in die Liste der übergeordneten Knoten aufzunehmen:

Beispiel für Nicht-Root-Knoten:

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
     )
;

Beispiel für Wurzelknoten:

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 bei http://www.sqlfiddle.com/#!4/d15e7/32