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

Find alle noder i en tilstødende listemodel med oracle connect by

Til sidst kom jeg med en løsning, der ligner denne:

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

Det fungerer med alle noder i det angivne eksempel. Men hvis et af bladene har en anden forælder, og startpunktet er over denne node eller i en anden gren, virker det ikke.

Men for mig er det godt nok.

En løsning til at få alle noder i grafen kunne være:implementere det modsatte af forespørgslen ovenfor (fra top til bund) og derefter udføre dem (bund til top, top til bund) omvendt, indtil du ikke finder flere nye noder. PL/SQL og jeg kender heller ikke til ydeevnen.



  1. SQL Server PIVOT måske?

  2. hvordan man håndterer MYSQL-forespørgselsopdatering som denne

  3. Det er meget langsomt at indsætte data fra CSV i MySQL DB

  4. Søg i 300 millioner adresser med pg_trgm