Cuối cùng tôi đã nghĩ ra một giải pháp tương tự như thế này:
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
);
Nó hoạt động với tất cả các nút trong ví dụ đã cung cấp, nhưng nếu một trong các lá có nút cha thứ hai và điểm bắt đầu nằm trên nút này hoặc trong một nhánh khác thì nó không hoạt động.
Nhưng đối với tôi như vậy là đủ tốt rồi.
Một giải pháp để có được tất cả các nút trong biểu đồ có thể là:thực hiện ngược lại với truy vấn ở trên (từ trên xuống dưới) và sau đó thực thi chúng (từ dưới lên trên, từ trên xuống dưới) ngược lại cho đến khi bạn không tìm thấy thêm các nút mới. PL / SQL và tôi cũng không biết về hiệu suất.