Om du vill använda den som vy kan du göra något som följande:
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
Underfrågan rek
kopplar alla syskon till trädet med rotelementet. Sedan behöver du bara använda den här frågan två gånger och koppla den via rotelementet för att få alla element som är kopplade via förälder-barn-relation.
Om du vill minska resultaten kan du använda SYS_CONNECT_BY_PATH
för att göra det:
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)
Detta ger dig till exempel endast dina barns och föräldrars startpunkt och inga inlägg från andra blad.