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