0

Connect-to-priorステートメントでのみ解決できると思う問題があります。

私のデータモデルは、次のように簡略化されています。

create table TASK
 ( TASK_ID number
);
create table ITEM
 ( TASK_ID number,
   NEXT_TASK_ID number
);    
create table TASK_ITEM
 ( TASK_ID number,
   ITEM_ID number
);

アイテムのセットが1つのタスクに結合されます。タスクのセットは1つ以上のアイテムに結合されます(これがTASK_ITEMジャンクションテーブルの出番です)。プロセスは一連のアイテムで始まり、単一のアイテムで終わります(ITEM.NEXT_TASK_IDは最後のアイテムではnullであり、最初のアイテムではtask_itemは存在しません)。

私の問題:

1つのtask_idが与えられた場合、先行するすべてのタスクを抽出したいと思います。

これは、Philip GreenspunによるOracleのツリーの優れた紹介、またはWikibookの階層クエリの説明に記載されている問題に隣接する問題ですが、IDとジャンクションテーブルがさらに含まれている場合、これらの問題に対処する適切な解決策を見つけることができないようです。

私自身のSQL-fooは悲しいことに不足しており、特定の問題の解決策を見つけることなく、私の心をググってしまいました。

キャリーフィッシャーの声で:私がオーバーフローをスタックするのを手伝ってください、あなたは私の唯一の希望です。

4

1 に答える 1

0

探しなさい、そうすれば見つかります。

同僚の助けを借りて、これを整理しました。

私が自分で見ることができなかったトリックは、最初に必要な情報を結合し、次にconnect to -statementを実行することです。

以下のコードは、説明されているように問題を解決すると思います。

select parent_task.* 
    from (
    select  parent_task_id, item_id, task_id, level
        from (
            select 
                task.task_id parent_task_id, 
                task_item.item_id, 
                item.task_id task_id
            from 
                task, task_item, item
            where 
                task_item.task_id = task.task_id
            and 
                item.item_id = task_item.item_id) properly_structured_parent_table    
        start with task_id = :TASK_ID
        connect by prior parent_task_id = task_id 
    ) task_hierarchy, task parent_task
where parent_task.task_id = task_hierarchy.task_id;

内側の mot SQL は適切な parent_table を構築します。次は、事前に接続して階層を構築します。最も外側の SQL は、アプリケーションでの必要に応じて残りのデータに結合します。

お時間をいただき、フィードバックをお寄せいただきありがとうございます。

于 2013-02-21T13:11:17.480 に答える