2

階層要素を含むテーブルがあります

テーブル :

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
4

2 に答える 2

2

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 に示す順序で行を返します。図では、子は親の下に表示されます。階層ツリーの説明については、

于 2012-10-05T13:23:28.467 に答える
0

1つのノードをルートノードに設定すると、1つのノードで開始する必要があることを意味します。同じ問題が発生しました。これが役立つことを願っています

SELECT level niveau, A
from table parent, table child
START WITH A IN ='P1'
CONNECT BY PRIOR  A= B
于 2013-04-29T06:19:23.903 に答える