Nếu bạn muốn sử dụng nó làm dạng xem, bạn có thể làm như sau:
WITH rek AS (SELECT item.id
, item.name
, connect_by_root item.id root_id
FROM item
START WITH parent_id IS null
CONNECT BY NOCYCLE parent_id = PRIOR id)
SELECT startItem.id startId
, startItem.name startName
, childItem.id childID
, childItem.name childName
FROM rek startItem
JOIN rek childItem
USING (root_id)
-- WHERE startItem.id = 3 -- This would be done from outside the view
Truy vấn con rek
kết nối tất cả anh chị em của cây với phần tử gốc. Sau đó, bạn chỉ phải sử dụng truy vấn này hai lần và kết nối nó qua phần tử gốc để nhận được tất cả các phần tử được kết nối qua quan hệ cha-con.
Nếu bạn muốn giảm tập kết quả, bạn có thể sử dụng SYS_CONNECT_BY_PATH
để làm như vậy:
WITH rek AS (SELECT item.id
, item.name
, connect_by_root item.id root_id
, SYS_CONNECT_BY_PATH(item.id, '/') path
FROM item
START WITH parent_id IS null
CONNECT BY NOCYCLE parent_id = PRIOR id)
SELECT startItem.id startId
, startItem.name startName
, childItem.id childID
, childItem.name childName
, childItem.path
FROM rek startItem
JOIN rek childItem
ON startItem.root_id = childItem.root_id
AND (startItem.path LIKE childItem.path||'/%'
OR childItem.path LIKE startItem.path||'/%'
OR childItem.id = startItem.id)
Ví dụ, điều này sẽ chỉ cung cấp cho bạn điểm xuất phát của trẻ em và cha mẹ của bạn và không có mục nhập từ các lá khác.