Oracle
 sql >> Base de données >  >> RDS >> Oracle

Trouver tous les nœuds dans un modèle de liste de contiguïté avec oracle connect by

Finalement, j'ai trouvé une solution similaire à celle-ci :

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

Cela fonctionne avec tous les nœuds pour l'exemple fourni. Mais si l'une des feuilles a un deuxième parent et que le point de départ est au-dessus de ce nœud ou dans une branche différente, cela ne fonctionne pas.

Mais pour moi, c'est assez bien.

Une solution pour obtenir tous les nœuds dans le graphique pourrait être :implémentez l'opposé de la requête ci-dessus (de haut en bas) puis exécutez-les (de bas en haut, de haut en bas) vice versa jusqu'à ce que vous ne trouviez plus de nouveaux nœuds. Cela nécessiterait PL/SQL et je ne connais pas non plus les performances.