Oracle
 sql >> Database >  >> RDS >> Oracle

Trova tutti i nodi in un modello di elenco di adiacenze con Oracle Connect by

Alla fine ho trovato una soluzione simile a questa:

  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
   );

Funziona con tutti i nodi per l'esempio fornito. Ma se una delle foglie ha un secondo genitore e il punto di partenza è sopra questo nodo o in un ramo diverso, non funziona.

Ma per me è abbastanza buono.

Una soluzione per ottenere tutti i nodi nel grafico potrebbe essere:implementare l'opposto della query sopra (dall'alto verso il basso) e quindi eseguirli (dal basso verso l'alto, dall'alto verso il basso) viceversa fino a quando non trovi più nuovi nodi. Ciò avrebbe bisogno Anche PL/SQL e io non conosciamo le prestazioni.