sql >> Databasteknik >  >> RDS >> Oracle

Hitta alla noder i en närliggande listmodell med oracle connect by

Till slut kom jag på en lösning liknande denna:

  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 fungerar med alla noder för det angivna exemplet. Men om ett av bladen har en andra förälder och startpunkten är ovanför denna nod eller i en annan gren fungerar det inte.

Men för mig är det bra nog.

En lösning för att få alla noder i grafen kan vara:implementera motsatsen till frågan ovan (uppifrån och ned) och sedan köra dem (botten till toppen, topp till botten) vice versa tills du inte hittar fler nya noder. Detta skulle behövas PL/SQL och jag vet inte heller om prestandan.



  1. Behåll fältvärden efter inlämning

  2. Min sql väljer från flera tabeller kontra join

  3. Använda en anpassad JSON-kodare för SQLAlchemys PostgreSQL JSONB-implementering

  4. MySql Single Table, Välj de senaste 7 dagarna och inkludera tomma rader