Alla fine ho trovato una soluzione simile a questa:
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
);
Funziona con tutti i nodi per l'esempio fornito. Ma se una delle foglie ha un secondo genitore e il punto di partenza è sopra questo nodo o in un ramo diverso, non funziona.
Ma per me è abbastanza buono.
Una soluzione per ottenere tutti i nodi nel grafico potrebbe essere:implementare l'opposto della query sopra (dall'alto verso il basso) e quindi eseguirli (dal basso verso l'alto, dall'alto verso il basso) viceversa fino a quando non trovi più nuovi nodi. Ciò avrebbe bisogno Anche PL/SQL e io non conosciamo le prestazioni.