最後に、私は次のような解決策を思いつきました:
SELECT child FROM child_parent START WITH parent =
(
SELECT DISTINCT parent FROM
(
SELECT parent
FROM child_parent
WHERE CONNECT_BY_ISLEAF = 1
START WITH child = 5
CONNECT BY PRIOR parent = child
UNION
SELECT parent
FROM child_parent
WHERE parent = 5
)
)
CONNECT BY NOCYCLE PRIOR child = parent
UNION
SELECT DISTINCT parent FROM
(
SELECT parent
FROM child_parent
WHERE CONNECT_BY_ISLEAF = 1
START WITH child = 5
CONNECT BY PRIOR parent = child
UNION
SELECT parent
FROM child_parent
WHERE parent = 5
);
提供された例ではすべてのノードで機能しますが、リーフの1つに2番目の親があり、開始点がこのノードの上または別のブランチにある場合は機能しません。
しかし、私にとってはそれで十分です。
グラフ内のすべてのノードを取得するための解決策は、次のようになります:上記のクエリの反対を(上から下に)実装し、新しいノードがなくなるまでそれらを実行します(下から上、上から下)。これには必要があります。 PL/SQLと私もパフォーマンスについて知りません。