Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Encontre todos os nós em um modelo de lista de adjacência com oracle connect by


Finalmente, cheguei a uma solução semelhante 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
   );

Ele funciona com todos os nós para o exemplo fornecido. Mas se uma das folhas tiver um segundo pai e o ponto de partida estiver acima desse nó ou em uma ramificação diferente, não funcionará.

Mas para mim é bom o suficiente.

Uma solução para obter todos os nós no gráfico poderia ser:implementar o oposto da consulta acima (de cima para baixo) e depois executá-los (de baixo para cima, de cima para baixo) vice-versa até não encontrar mais novos nós. PL/SQL e também não sei sobre o desempenho.