W końcu wymyśliłem rozwiązanie podobne do tego:
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
);
Działa ze wszystkimi węzłami w podanym przykładzie. Ale jeśli jeden z liści ma drugiego rodzica, a punkt początkowy znajduje się nad tym węzłem lub w innej gałęzi, nie działa.
Ale dla mnie to wystarczy.
Rozwiązaniem pozwalającym uzyskać wszystkie węzły na wykresie może być:zaimplementuj przeciwieństwo powyższego zapytania (od góry do dołu), a następnie wykonaj je (z dołu do góry, z góry na dół) na odwrót, dopóki nie znajdziesz więcej nowych węzłów. PL/SQL i ja też nie wiem o wydajności.