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

Finden Sie alle Knoten in einem Adjazenzlistenmodell mit Oracle Connect by

Schließlich kam ich auf eine ähnliche Lösung wie diese:

  SELECT child FROM child_parent START WITH parent =
   (
    SELECT DISTINCT parent FROM   
     (
      SELECT parent
      FROM child_parent
      WHERE CONNECT_BY_ISLEAF = 1
        START WITH child = 5
        CONNECT BY PRIOR parent = child
      UNION
      SELECT parent
      FROM child_parent
      WHERE parent = 5
     ) 
   )
   CONNECT BY NOCYCLE PRIOR child = parent
   UNION
   SELECT DISTINCT parent FROM   
   (
    SELECT parent
    FROM child_parent
    WHERE CONNECT_BY_ISLEAF = 1
      START WITH child = 5
      CONNECT BY PRIOR parent = child
    UNION
    SELECT parent
    FROM child_parent
    WHERE parent = 5
   );

Es funktioniert mit allen Knoten für das bereitgestellte Beispiel. Aber wenn eines der Blätter einen zweiten Elternteil hat und der Startpunkt über diesem Knoten oder in einem anderen Zweig liegt, funktioniert es nicht.

Aber für mich ist es gut genug.

Eine Lösung, um alle Knoten im Diagramm zu erhalten, könnte sein:Implementieren Sie das Gegenteil der obigen Abfrage (von oben nach unten) und führen Sie sie dann (von unten nach oben, von oben nach unten) umgekehrt aus, bis Sie keine neuen Knoten mehr finden. Dies wäre erforderlich PL/SQL und ich wissen auch nichts über die Performance.