Nakonec jsem přišel s podobným řešením:
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
);
Funguje se všemi uzly pro uvedený příklad. Pokud má ale jeden z listů druhého rodiče a počáteční bod je nad tímto uzlem nebo v jiné větvi, nefunguje to.
Ale pro mě je to dost dobré.
Řešením pro získání všech uzlů v grafu by mohlo být:implementujte opak výše uvedeného dotazu (shora dolů) a poté je spusťte (zdola nahoru, shora dolů) naopak, dokud nenajdete žádné další nové uzly. PL/SQL a o výkonu také nevím.