Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Vollständige Oracle SQL-Hierarchie mit einem beliebigen Knoten als Eingabe

Wenn Sie es als Ansicht verwenden möchten, können Sie Folgendes tun:

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

Die Unterabfrage rek verbindet alle Geschwister des Baums mit dem Wurzelelement. Dann müssen Sie diese Abfrage nur zweimal verwenden und über das Wurzelelement verbinden, um alle Elemente zu erhalten, die über eine Eltern-Kind-Beziehung verbunden sind.

Wenn Sie die Ergebnismenge reduzieren möchten, können Sie den SYS_CONNECT_BY_PATH verwenden dazu:

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)

Dadurch erhalten Sie zum Beispiel nur die Kinder und Eltern Ihres Startpunkts und keine Einträge aus anderen Blättern.