ビューとして使用したい場合は、次のようにできます:
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
ツリーのすべての兄弟をルート要素に接続します。次に、このクエリを 2 回使用し、ルート要素を介して接続するだけで、親子関係を介して接続されているすべての要素を取得できます。結果セットを減らしたい場合は、
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)
プレ>たとえば、これにより、開始点の子と親のみが提供され、他のリーフからのエントリは提供されません。