階層要素を含むテーブルがあります
テーブル :
AB P1 - P2 P1 C1 P2 C2 P2
B は同じテーブルからの外部キーです
クエリは次のとおりです。
SELECT レベル ニボー、A テーブルの親、テーブルの子から インで始める (「P0」、「P1」、「C2」) 前の A= B で接続
結果
1 P1 1 P2 2 C1 2 C2 1 C2
なぜ「2 C2」が現れるのですか?
正しい結果ではありませんが、望ましい結果は次のとおりです。
1 P1 1 P2 2 C1 1 C2
階層要素を含むテーブルがあります
テーブル :
AB P1 - P2 P1 C1 P2 C2 P2
B は同じテーブルからの外部キーです
クエリは次のとおりです。
SELECT レベル ニボー、A テーブルの親、テーブルの子から インで始める (「P0」、「P1」、「C2」) 前の A= B で接続
結果
1 P1 1 P2 2 C1 2 C2 1 C2
なぜ「2 C2」が現れるのですか?
正しい結果ではありませんが、望ましい結果は次のとおりです。
1 P1 1 P2 2 C1 1 C2
Connect by条件が最初に評価され、start with後で評価されます。あなたの場合、 C2 は P2 の子であり、階層のルートでもあります。これが、結果に 2 回表示される理由です。
Oracle は、階層クエリを次のように処理します。
結合が存在する場合は、結合が FROM 句で指定されているか、WHERE 句の述語で指定されているかに関係なく、最初に評価されます。
CONNECT BY 条件が評価されます。
残りの WHERE 句の述語が評価されます。
Oracle は、これらの評価からの情報を使用して、次の手順を使用して階層を形成します。
Oracle は、階層のルート行 (START WITH 条件を満たす行) を選択します。
Oracle は、各ルート行の子行を選択します。各子行は、ルート行の 1 つに関して CONNECT BY 条件の条件を満たす必要があります。
Oracle は、連続する世代の子行を選択します。Oracle は最初に手順 2 で返された行の子を選択し、次にそれらの子の子を選択します。Oracle は常に、現在の親行に関して CONNECT BY 条件を評価して子を選択します。
問合せに結合のない WHERE 句が含まれている場合、Oracle は WHERE 句の条件を満たさないすべての行を階層から削除します。Oracle は、条件を満たさない行のすべての子を削除するのではなく、行ごとに個別にこの条件を評価します。
Oracle は、図 9-1 に示す順序で行を返します。図では、子は親の下に表示されます。階層ツリーの説明については、
1つのノードをルートノードに設定すると、1つのノードで開始する必要があることを意味します。同じ問題が発生しました。これが役立つことを願っています
SELECT level niveau, A
from table parent, table child
START WITH A IN ='P1'
CONNECT BY PRIOR A= B