[Ullman-Widom]
5.3. Datalog
szabályok és
lekérdezések [Ullman-Widom]
10.2.
Rekurzió az SQL-ben (466-474.o.)
Rek1.feladat:
- Az
alábbi feladat a
tankönyv (Ullman-Widom kék
könyv) 10.2 szakaszára épül. Jaratok(legitarsasag,
honnan, hova, koltseg, indulas, erkezes)
táblában repülőjáratok
adatait
tároljuk.
-
Készítsetek ebből
saját példányt: jaratok_tabla.txt
és az
alapján
dolgozzatok
DROP TABLE jaratok;
CREATE TABLE jaratok(
legitarsasag CHAR(2),
honnan VARCHAR2(10),
hova VARCHAR2(10),
koltseg NUMBER,
felszallas NUMBER,
erkezes NUMBER);
INSERT INTO jaratok VALUES('UA', 'SF','DEN', 1000, 930,1230);
INSERT INTO jaratok VALUES('AA', 'SF','DAL', 10000, 900,1430);
INSERT INTO jaratok VALUES('UA','DEN','CHI', 500, 1500,1800);
INSERT INTO jaratok VALUES('AA','DEN','DAL', 2000, 1400,1700);
INSERT INTO jaratok VALUES('AA','DAL','CHI', 600, 1530,1730);
INSERT INTO jaratok VALUES('AA','DAL', 'NY', 2000, 1500,1930);
INSERT INTO jaratok VALUES('AA','CHI', 'NY', 3000, 1900,2200);
INSERT INTO jaratok VALUES('UA','CHI', 'NY', 2000, 1830,2130);
INSERT INTO jaratok
VALUES('LH',
'CHI', 'DEN', 2000, 1900, 2100);
- (Papíros feladat) Fejezzzük ki Datalog
programmal, hogy mely (x,y)
város
párokra
lehetséges egy vagy
több
átszállással eljutni x
városból y városba?
- Megoldás:
1. Eljut(X, Y)
<- Jaratok(L, X, Y, K, F, E)
2. Eljut(X, Y) <-
Eljut(X, Z) AND Jaratok(L, Z, Y, K, F, E)
- (Papíros feladat) A fenti rekurzív Datalog
programot
írjuk át az SQL3 szabványban
szereplő WITH RECURSIVE
utasítással! (papíron, mert az Oracle
nem támogatja)
(viszont az Oracle-ben láttuk a CONNECT
BY PRIOR-t, lásd 9gyak#Rek1)
- Megoldás:
WITH eljut AS
(SELECT honnan, hova FROM jaratok
UNION
SELECT eljut.honnan, jaratok.hova
FROM eljut, jaratok
WHERE eljut.hova = jaratok.honnan
AND eljut.honnan <> jaratok.hova)
SELECT * FROM eljut;
- A fenti nemnegált rekurzív Datalog
programot
írjuk át Oracle PL/SQL programra!
- Ehhez előbb hozzuk
létre egy
alábbi szerkezetű ELJUT táblát:
DROP TABLE Eljut;
CREATE TABLE Eljut(
honnan VARCHAR2(10),
hova VARCHAR2(10));
-
Írjunk egy olyan
PL/SQL programot, ami
feltölti az
ELJUT
táblát a megfelelő
város párokkal,
ahol
az első városból el lehet jutni a
másodikba. Mely (x, y)
várospárokra
lehetséges
egy vagy több átszállással
eljutni x városból y városba?
(Fontos! Önmagával
ne szerepeljen egy város sem!)
Rek2.feladat:
- (Papíros feladat) Fejezzzük ki Datalog
programmal, hogy mely (x,y)
város
párokra
milyen költségekkel
lehetséges egy vagy
több
átszállással eljutni x
városból y városba?
- Megoldás:
1. Eljut(X, Y, K)
<-
Jaratok(L, X, Y, K, F, E)
2. Eljut(X, Y, K) <-
Eljut(X, Z, K1) AND Jaratok(L2, Z, Y, K2, F2, E2) AND K=K1+K2
- Most hozzuk
létre egy
alábbi szerkezetű ELJUT táblát, amely
a költséget is tartalmazza:
DROP TABLE Eljut;
CREATE TABLE Eljut(
honnan VARCHAR2(10),
hova VARCHAR2(10),
koltseg NUMBER);
- Most
úgy töltsük
fel az ELJUT
táblát,
hogy a költség oszlop a minimális
költséget
tartalmazza a két város
között (A
és B város
között a lehető legolcsóbb út
költsége)
Rek3.feladat:
- Tegyük fel, hogy nemcsak
az
érdekel, hogy el tudunk-e jutni az egyik
városból a másikba,
hanem az is, hogy
utazásunk
során az átszállások is
ésszerűek legyenek, vagyis ha több
járattal utazunk
és
átszállásra van
szükségünk, akkor az érkező
járatnak legalább egy
órával a
rá következő indulás előtt meg
kell
érkeznie.
(Feltehetjük, hogy nincs
egy
napnál hosszabb utazás)
- Ezt a feladatot is fejezzzük ki előbb Datalog programmal,
majd hozzuk létre az ELJUT
táblát a
megfelelő szerkezettel,
és most úgy töltsük fel az
ELJUT
táblát, hogy a minimális
időt tartalmazza két város
között (A
és B város
között a lehető leggyorsabb út
és ideje)
Rek4.feladat:
- A fenti feladatokat old meg PL/SQL-ben úgy is, hogy ne csak a
várospárokat, hanem
a teljes útvonalat is listázzuk ki.
PL/SQL
GYAKOROLÓ FELADATOK:
-- Lásd Feladatok.pdf (8-9-10.
fejezet
feladatai)
-- Ehhez: a táblák
létrehozása cr_dept_emp.sql