Jika Anda ingin menggunakannya sebagai tampilan, Anda dapat melakukan sesuatu sebagai berikut:
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
Subkueri rek
menghubungkan semua saudara pohon dengan elemen root. Maka Anda hanya perlu menggunakan query ini dua kali dan menghubungkannya melalui elemen root untuk mendapatkan semua elemen yang terhubung melalui relasi parent-child.
Jika Anda ingin mengurangi hasil, Anda dapat menggunakan SYS_CONNECT_BY_PATH
untuk melakukannya:
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)
Ini misalnya akan memberi Anda hanya anak-anak dan orang tua dari Anda titik awal dan tidak ada entri dari daun lain.