Als u het als weergave wilt gebruiken, kunt u het volgende doen:
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
De subquery rek
verbindt alle broers en zussen van de boom met het wortelelement. Dan hoef je deze query maar twee keer te gebruiken en via het root-element te verbinden om alle elementen te krijgen die via parent-child-relatie zijn verbonden.
Als u de resultatenset wilt verkleinen, kunt u de SYS_CONNECT_BY_PATH
gebruiken om dit te doen:
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)
Dit geeft je bijvoorbeeld alleen de kinderen en ouders van je startpunt en geen invoer van andere bladeren.