Ако искате да го използвате като изглед, можете да направите нещо като следното:
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
Подзаявката rek
свързва всички братя на дървото с коренния елемент. След това трябва само да използвате тази заявка два пъти и да я свържете чрез основния елемент, за да получите всички елементи, които са свързани чрез релация родител-дете.
Ако искате да намалите набора от резултати, можете да използвате SYS_CONNECT_BY_PATH
за да направите това:
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)
Това например ще ви даде само децата и родителите на вашата начална точка и никакви записи от други листове.