sql >> データベース >  >> RDS >> Oracle

任意のノードを与えるルートからツリー全体を見つけます

    最初にツリーを上に移動してすべてのマネージャーを取得し、次に下に移動してすべての従業員を取得する必要があります。

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

    http://www.sqlfiddle.com/#!4/d15e7/18<を参照してください。 / a>

    編集:

    指定されたノードがルートノードでもある可能性がある場合は、クエリを拡張して、指定されたノードを親ノードのリストに含めます。

    非ルートノードの例:

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

    ルートノードの例:

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

    http://www.sqlfiddle.com/#!4/d15e7/32でフィドル



    1. 日付/時刻比較のための操作のための照合の違法な組み合わせ

    2. チェックボックス値をデータベースに挿入する

    3. MySQLとMariaDBで大量のデータを処理する

    4. MySQLで文字列部分をGROUPBYする方法