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!