Най-накрая измислих решение, подобно на това:
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
);
Работи с всички възли за предоставения пример. Но ако един от листата има втори родител и началната точка е над този възел или в различен клон, това не работи.
Но за мен е достатъчно добро.
Решение за получаване на всички възли в графиката може да бъде:внедрите обратното на заявката по-горе (отгоре надолу) и след това ги изпълнете (отдолу нагоре, отгоре надолу) обратно, докато не намерите повече нови възли. Това ще трябва PL/SQL и аз също не знам за производителността.