sql >> Databáze >  >> RDS >> Oracle

Najděte celý strom od kořene s libovolným uzlem

Nejprve musíte projít stromem nahoru, abyste získali všechny manažery, a poté dolů, abyste získali všechny zaměstnance:

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

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

Upravit:

Pokud daný uzel může být také kořenovým uzlem, rozšiřte dotaz tak, aby zahrnoval daný uzel v seznamu nadřazených uzlů:

Příklad pro nekořenový uzel:

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

Příklad pro kořenový uzel:

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



  1. Přístup pouze pro čtení k obsahu uložené procedury

  2. Vzor úložiště bez LINQ nebo jiného ORM?

  3. Laravel Výmluvná dvojnásobná hodnota uložená v databázi se vrátila zaokrouhlená

  4. Laravel Eloquent with()-> vrací hodnotu null