2016-08-02 8 views
0

私はテーブルを持っていますが、ツリーを抽出する関係を書くことができません。ここで Oracleで階層クエリを生成する方法は?

は、データの一例である:

LOT_ID | LOT_PRODUCED | ITEM_PRODUCED | ITEM_USED | LOT_USED | OPERATION | STEP 
------ | ------------ | ------------- | --------- | -------- | --------- | ---- 
1  | LOT_1  | ITEM_1  | null  | null  | P   | STEP_1 
1  | null   | null   | ITEM_1 | LOT_1 | C   | STEP_2 
5  | null   | null   | ITEM_2 | LOT_2 | C   | STEP_2 
5  | LOT_2  | ITEM_2  | null  | null  | P   | STEP_8 
5  | null   | null   | ITEM_2 | LOT_2 | C   | STEP_1 
6  | null   | null   | ITEM_2 | LOT_7 | C   | STEP_8 

LOT_PRODUCED = LOT_1から始めて、私は出発たくさんのステップにリンクされているすべての手順で木を持っているしたいと思います。

この例では、STEP_1(LOT_1を生成したステップ)がLOT_2を消費することがわかります。そのロットはSTEP_8によって作成されました。このステップは、次にLOT_7を消費する。等々。

私はSTART WITHとCONNECT BYという概念を理解していると思いますが、リンクが列間で「ジャンプ」するため、このケースを解決することはできません。定義された親と子はありません。

これは簡単なクエリで解決できない場合、私はストアドプロシージャを開いています。

編集:Here is a drawing of the data shown above

だから左側のリンクの説明があります。ステップは多くを生産する

  • ステップによって消費

    • たくさん

    そして右側にはリンクがあります:connの番号ectorsは上記のデータの行番号です。

  • +0

    泥として澄んでいます。LOT_1がLOT_2を消費することを示す行はどれですか?あなたのテーブルには、直接的にまたは他の行の連鎖によって、それらの間の接続を示す行はありません。 (もしあれば、説明してください) – mathguy

    +0

    3つの列挙可能なエンティティ(ロット、アイテム、およびステップ)があるようです。しかし、私は、これらのことの間に関係が何であるかは明らかではないと思います。あなたの質問を編集して、これらのことを(大まかに)示してください。これは、アイテムを作成するステップ、アイテムを使用するステップ、そしてアイテム_use_uses_を作成するステップのように見えます。あなたは明確にしますか? – halfer

    +0

    質問に埋め込まれたグラフィック表現が問題の説明に役立つ場合があります。 – halfer

    答えて

    0

    私は、クエリを作ってみた:

    SELECT DISTINCT G.STEP, 
        LOT_USED, 
        ITEM_USED, 
        LOT_PRODUCED, 
        ITEM_PRODUCED 
    FROM GENEALOGY G 
        START WITH G.STEP  = 'STEP01' 
        CONNECT BY LOTPRODUCED = PRIOR LOTUSED 
    AND ITEMPRODUCED   = PRIOR ITEMUSED 
    ORDER BY G.STEP 
    

    しかし、これが唯一の消費の最初のレベルを返します:開始ステップから を、私は多くを消費して、これらのロットごとに取得し、私が手それを作り出したステップ。私はまた、もしあれば、スタートステップによって生産されたロットを得る。私の例のデータとリンクする

    、私は(STEP_1から開始)を取得:

    STEP | LOT_USED | ITEM_USED | LOT_PRODUCED | ITEM_PRODUCED 
    -------|----------|-----------|--------------|--------------- 
    STEP_1 | LOT_2 | ITEM_2 |    | 
    STEP_1 |   |   | LOT_1  | ITEM_1 
    STEP_8 |   |   | LOT_2  | ITEM_2 
    

    私は、サブクエリとして、既存の一部が含まれるようにクエリを変更:

    SELECT DISTINCT H.STEP, 
        LOTUSED, 
        ITEMUSED, 
        LOTPRODUCED, 
        ITEMPRODUCED 
    FROM GENEALOGY H 
        START WITH H.STEP IN 
        (SELECT DISTINCT G.STEP 
        FROM GENEALOGY G 
         START WITH G.STEP = 'STEP_1' 
         CONNECT BY LOTPRODUCED = PRIOR LOTUSED 
        AND ITEMPRODUCED   = PRIOR ITEMUSED 
        ) 
        CONNECT BY LOTPRODUCED = PRIOR LOTUSED 
    AND ITEMPRODUCED   = PRIOR ITEMUSED 
    ORDER BY H.STEP 
    

    私は消費の2つのレベルを取得します。私の例のデータとリンクする

    、私は(STEP_1から開始)を取得:

    STEP | LOT_USED | ITEM_USED | LOT_PRODUCED | ITEM_PRODUCED 
    -------|----------|-----------|--------------|--------------- 
    STEP_1 | LOT_2 | ITEM_2 |    | 
    STEP_1 |   |   | LOT_1  | ITEM_1 
    STEP_8 |   |   | LOT_2  | ITEM_2 
    STEP_8 | LOT_7 | ITEM_2 |    | 
    

    だから私は、クエリに存在BY CONNECTなど消費の多くのレベルを取得することができます。 もちろん、私は完全な木を手に入れたいと思います。 レベル数は事前に分かりませんが、たとえそれが30のようなものだったとしても、私のクエリは何の理由もなく「巨大」になります。

    私の問題のより簡単なクエリを作成するのに役立つアイデアはありますか? P(プロダクション)とC(消費)OPERATIONフィールドとLOT_IDで動作するのでしょうか?

    関連する問題