sql >> Base de Datos >  >> RDS >> Oracle

Encuentre todos los nodos en un modelo de lista de adyacencia con Oracle Connect by

Finalmente se me ocurrió una solución similar a esta:

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

Funciona con todos los nodos para el ejemplo proporcionado. Pero si una de las hojas tiene un segundo padre y el punto de partida está encima de este nodo o en una rama diferente, no funcionará.

Pero para mí es lo suficientemente bueno.

Una solución para obtener todos los nodos en el gráfico podría ser:implementar lo contrario de la consulta anterior (de arriba a abajo) y luego ejecutarlos (de abajo a arriba, de arriba a abajo) viceversa hasta que no encuentre más nodos nuevos. Esto necesitaría PL/SQL y tampoco sé sobre el rendimiento.