Til sidst kom jeg med en løsning, der ligner denne:
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
);
Det fungerer med alle noder i det angivne eksempel. Men hvis et af bladene har en anden forælder, og startpunktet er over denne node eller i en anden gren, virker det ikke.
Men for mig er det godt nok.
En løsning til at få alle noder i grafen kunne være:implementere det modsatte af forespørgslen ovenfor (fra top til bund) og derefter udføre dem (bund til top, top til bund) omvendt, indtil du ikke finder flere nye noder. PL/SQL og jeg kender heller ikke til ydeevnen.