Schließlich kam ich auf eine ähnliche Lösung wie diese:
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
);
Es funktioniert mit allen Knoten für das bereitgestellte Beispiel. Aber wenn eines der Blätter einen zweiten Elternteil hat und der Startpunkt über diesem Knoten oder in einem anderen Zweig liegt, funktioniert es nicht.
Aber für mich ist es gut genug.
Eine Lösung, um alle Knoten im Diagramm zu erhalten, könnte sein:Implementieren Sie das Gegenteil der obigen Abfrage (von oben nach unten) und führen Sie sie dann (von unten nach oben, von oben nach unten) umgekehrt aus, bis Sie keine neuen Knoten mehr finden. Dies wäre erforderlich PL/SQL und ich wissen auch nichts über die Performance.