Rek2 -- Az
Eljut-feladat. Tankönyv 10.2.
Az Eljut-feladat. Rekurzió
az SQL-ben
    Feladat:  Fejezzük ki WITH
RECURSIVE utasítással, hogy
mely városokba tudunk 
    'DAL' (Dallas)-ból eljutni legfeljebb
3 átszállással és
legfeljebb 5000 költségből. 
   
   
    -- Ehhez
egy kis segítség: Tankönyv 11.2
fejezetében az Eljut feladatra megadott 
        SQL-1999
szabvány megoldás
(csak papíron!) 
           
WITH RECURSIVE eljut (honnan, hova) AS 
           
   
  (SELECT honnan, hova FROM jaratok
           
 UNION
          
   
   SELECT eljut.honnan, jaratok.hova FROM eljut, jaratok 
                
  
   WHERE eljut.hova = jaratok.honnan)
           
SELECT hova FROM eljut WHERE honnan='DAL'; 
      
   
    -- Megoldás: Készítünk egy
eljut(honnan, hova, atszallas, koltseg) munkatáblát, 
    -- majd ennek az ideiglenes eljut tábla
lekérdezésével kapjuk meg az eredményt: 
     
    WITH RECURSIVE eljut(honnan, hova, atszallas, koltseg) AS 
            (SELECT honnan, hova, 0 atszallas, koltseg FROM jaratok
        UNION
             SELECT
eljut.honnan honnan, jaratok.hova hova, eljut.atszallas+1 atszallas,
 
                 eljut.koltseg+jaratok.koltseg koltseg FROM eljut, jaratok 
                 WHERE eljut.y = jaratok.honnan)
    SELECT DISTINCT hova FROM eljut WHERE honnan='DAL' 
                  and atszallas<=3 and koltseg<5000;
    
    -- Ez az SQL-1999 szabvány szerinti WITH RECURSIVE, amit tudni kell
    -- a vizsgára papíron, de ezt ne próbálják meg az Oracle-ben, mert 
    -- ott kicsit másként néz ki, de azt már nem  kell tudni a vizsgára. 
    -- Ha valaki mégis futtatá, ahhoz egy kicsit át kell írnia Oracle-be: 
    -- Adatok: http://people.inf.elte.hu/sila/eduAB/jaratok_tabla.txt 
     
    WITH eljut(honnan, hova, atszallas, koltseg) AS 
            (SELECT honnan, hova, 0 atszallas, koltseg FROM jaratok
        UNION ALL
             SELECT
eljut.honnan honnan, jaratok.hova hova, eljut.atszallas+1 atszallas,
 
                 eljut.koltseg+jaratok.koltseg koltseg FROM eljut, jaratok 
                 WHERE eljut.hova = jaratok.honnan)
         SEARCH DEPTH FIRST BY honnan SET SORTING
        CYCLE honnan SET is_cycle TO 1 DEFAULT 0
     SELECT DISTINCT hova FROM eljut 
     WHERE honnan='DAL' and atszallas<=3 and koltseg<5000;
     --- ezt persze nem kell tudni fejből, csak gépnél az Oracle doksiból. 
     
 -- HF: Ahogyan a Rec1 feladatot megvalósítottuk Oracle PL/SQL-ben, ehhez 
    a Rec2 feladathoz is készítsünk 
Eljut2(honnan,
hova,
atszallas, koltseg) 
    táblát és a sorait a járatok
tábla alapján PL/SQL programmal
töltsük fel!