7.előadáshoz kieg.: Adatbázisok-I. dr. Hajas Csilla (ELTE IK) http://sila.hajas.elte.hu/ Logika a relációs lekérdezésekhez: Datalog és Rekurzió (Eljut feladat) Tankönyv: 5.1.-5.2. Logika a relációkhoz: Datalog 10.2. WITH munkatáblák a SELECT-hez, Rekurzív lekérd.: WITH RECURSIVE Az előadások Ullman-Widom: Adatbázisrendszerek Alapvetés alapján készültek, forrás: http://infolab.stanford.edu/~ullman/dscb.html Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 1
Témakörök Tankönyv 5.3. Logika a relációkhoz: Datalog 5.4. A relációs algebra és nem-rekurzív biztonságos Datalog kifejező erejének összehasonlítása 10.2. Az Eljut-feladat (monoton, lineáris rekurzió) megoldása (a.) a Datalogban (b.) az SQL-ben WITH RECURSION utasítással Kiegészítések a rekurzióhoz, az Eljut feladat megoldása: (c.) Eljut feladat PL/SQL-ben (illetve SQL/PSM-ben) (d.) Oracle megoldások/2: CONNECT BY PRIOR (e.) Oracle megoldások/3: WITH alkérdés faktorizáció Végén (csak gyakorlatra) Oracle hierarchikus lekérdezések Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 2
Következik Relációs algebra korlátai: bizonyos típusú lekérdezéseket nem tudunk relációs algebrával kifejezni Nézzünk meg olyan logikai felépítést, amivel az ilyen rekurzív jellegű lekérdezések könnyen megoldhatók. Ez a nyelv: a Datalog Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 3
Milyen fontos rekurzív feladatok vannak? I. Hierarchiák bejárása Leszármazottak-ősök ParentOf(parent,child) Find all of Mary s ancestors Vállalati hierarchia felettes-beosztott Employee(ID,salary) Manager(mID,eID) Project(name,mgrID) Find total salary cost of project X Alkatrész struktúra (mely alkatrésznek mely alkatrész része) Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 4
Milyen fontos rekurzív feladatok vannak? II. Gráf jellegű bejárások Repülőgép járatok, eljut-feladat Flight(orig,dest,airline,cost) Find cheapest way to fly from A to B Közösségi hálók Ki-kinek az ismerőse, Twitterben ki-kit követ Kiegészítés a gráf adatbázisokról Gráfok könnyen megadhatók relációs táblával, a gráf lekérdezések egyre gyakoribb feladatok, ezek relációs megoldása hatékonysági kérdés. Vannak kimondottan gráf-adatbázisok. Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 5
Bevezető motiváció: Rekurzív SQL Alkérdés-faktorizáció WITH utasítással. SQL-99 szabványban szerepel. Az Oracle 11.2 verziótól kezdve a WITH rekurzív lekérdezésekre is használható (kiegészítésekkel). A MS SQL Server 2005-ben implementálták a rekurziót is. Rögzítsük egy irányított gráf éleit, és kérdezzük le, honnan hová vezet út! Minden él út is egyben, és ha van él x-ből z-be, és van út z-ből y-ba, akkor van út x-ből y-ba is. Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 6
Bevezető motiváció: Rekurzív SQL create table el (honnan INT, hova INT); insert into el values (1,2); insert into el values (2,3), insert into el values (1,4); 1 Oracle: Alkérdés faktorizáció WITH [RECURSION] ut AS (select * from el UNION ALL -- Oracle-ben select el.honnan, ut.hova from el, ut where el.hova=ut.honnan) select * from ut; 2 4 3 honnan el: 1 2 2 3 1 4 honnan ut: 1 2 2 3 1 4 1 3 hova hova Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 7
Bevezető motiváció: Rekurzív SQL A WITH ben definiált ut tábla átmeneti munkatábla, az utasítás végén szereplő lekérdezés futása után már nem lehet rá hivatkozni. A lekérdezést részekre lehet szétbontani (alkérdés faktorizáció), rekurzív lekérdezések megadhatóak. Az él, út példában két szabályt adtunk meg: select * from el Első szabály: ut(x,y) el(x,y) select el.honnan, ut.hova from el, ut where el.hova=ut.honnan Második szabály: ut(x,y) el(x,z) and ut(z,y) Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 8
Kérdések: Bevezetés: Rekurzív SQL Hogyan változik az SQL lekérdező ereje ezzel a lehetőséggel? Hogyan értékelődnek ki az ilyen lekérdezések? Hogyan lehet optimalizálni az ilyen lekérdezéseket? Logika a relációkhoz: Olyan lekérdezőnyelveket definiálunk, amelyekben ilyen szabályok adhatók meg. Az ideiglenes táblákat IDB (intenzionális) tábláknak, a többi táblát EDB (extenzionális) táblának fogjuk nevezni. Az EDB táblákat tároljuk, az IDB táblákat az EDB és IDB táblák alapján lekérdezésekkel definiáljuk. Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 9
Logika, mint lekérdező nyelv Datalog: logikai, szabály-alapú nyelv szabály: IF feltétel THEN eredmény, ahol a feltétel relációkkal legyen megadható és az eredmény pedig az output tábla sorait eredményezze A példa a Sörivók adatbázison alapszik Látogat(név, söröző), Szeret(név, sör), Felszolgál(söröző, sör, ár). Adjunk meg egy olyan szabályt, amely lekérdezi a boldog sörivókat, akik olyan sörözőt látogatnak, ahol felszolgálnak olyan sört, amelyet szeretnek. Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 10
Datalog szabályok felépítése Boldog(n) Látogat(n,bár) AND Szeret(n,sör) AND Felszolgál(bár,sör, ár) Szabály feje = akkor Szabály törzse = ha = egy egyszerű részcél részcélok AND-el kapcsolva if-then ( ha-akkor ) szabályok Részcélok: relációs atomi formulák (argumentumai változók vagy konstansok), akkor igaz, ha a behelyettesítési értékekből álló n-est tartalmazza a rel. atomi formulához tartozó tábla Interpretáció: n akkor boldog, ha létezik olyan bár, sör, ár érték, amire (n,bár) sora a Látogat táblának, stb, többire is. Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 11
Példa: Aritmetikai részcélok A beer is cheap if there are at least two bars that sell it for under $2. Cheap(beer) Sells(bar1,beer,p1) AND Sells(bar2,beer,p2) AND p1 < 2.00 AND p2 < 2.00 AND bar1 <> bar2 Feladatok: Írjuk át SQL SELECT utasításra a fenti szabályt! Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 12
Negált részcélok NOT in front of a subgoal negates its meaning. Example: Think of Arc(a,b) as arcs in a graph. S(x,y) says the graph is not transitive from x to y ; i.e., there is a path of length 2 from x to y, but no arc from x to y. S(x,y) Arc(x,z) AND Arc(z,y) AND NOT Arc(x,y) Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 13
Biztonságossági elvárás A szabályok kiértékelhetőek legyenek, ehhez: A szabályban szereplő minden változónak elő kell fordulnia a törzsben nem-negált relációs atomban Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 14
Biztonságos szabályok A rule is safe if: 1. Each distinguished variable, 2. Each variable in an arithmetic subgoal, and 3. Each variable in a negated subgoal, also appears in a nonnegated, relational subgoal, amivel az x korlátozott: pred(x, y, ) argumentuma (értéke a táblából) vagy x=c (konstans) vagy x=y (ahol y korlátozott) Safe rules prevent infinite results. Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 15
Példa: Nem biztonságos szabályokra Each of the following is unsafe and not allowed: 1. S(x) R(y) 2. S(x) R(y) AND x < y 3. S(x) R(y) AND NOT R(x) In each case, an infinity of x s can satisfy the rule, even if R is a finite relation. Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 16
Datalog programok Datalog program = collection of rules. In a program, predicates can be either 1. EDB relációk = Extensional Database = stored table (csak a törzsben szereplő relációk) 2. IDB relációk = Intensional Database = relation defined by rules (szerepel fej-ben) Never both! No EDB in heads. Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 17
Datalog programok kiértékelése As long as there is no recursion, we can pick an order to evaluate the IDB predicates, so that all the predicates in the body of its rules have already been evaluated. If an IDB predicate has more than one rule, each rule contributes tuples to its relation. Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 18
Példa: Datalog program Using EDB Sells(bar, beer, price) and Beers(name, manf), find the manufacturers of beers Joe doesn t sell. JoeSells(b) Sells( Joe s Bar, b, p) Answer(m) Beers(b,m) AND NOT JoeSells(b) Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 19
Példa: Kiértékelése Step 1: Examine all Sells tuples with first component Joe s Bar. Add the second component to JoeSells. Step 2: Examine all Beers tuples (b,m). If b is not in JoeSells, add m to Answer. Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 20
Datalog kifejező ereje Without recursion, Datalog can express all and only the queries of core relational algebra. The same as SQL select-from-where, without aggregation and grouping. But with recursion, Datalog can express more than these languages. Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 21
Relációs algebrai kifejezések átírása Mi a leggyakrabban előforduló típus, amiből építkezek? Lista ( Felt (R S ) Ezt a komponenst támogatja legerősebben az SQL is: SELECT lista FROM táblák összekapcsolása WHERE felt Ez felel meg egy Datalog szabálynak. Halmazműveletek: kezdjük ezzel, hogyan lehet a metszetet és különbséget Datalog szabállyal, és az egyesítést Datalog programmal kifejezni. Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 22
Relációs algebra és Datalog ---1 Rel.algebrai műveletek hogyan néznek ki Datalogban? Halmazműveletek: T.f.h R(x 1,...,x n ), S(x 1,...,x n ) predikátumokhoz tartozó reláció R(A 1,...,A n ), S(A 1,...,A n ) R S metszetnek megfelelő szabály: Válasz(x 1,...,x n ) R(x 1,...,x n ) AND S(x 1,...,x n ) R-S különbségnek megfelelő szabály: Válasz(x 1,...,x n ) R(x 1,...,x n ) AND NOT S(x 1,...,x n ) R S unió műveletet egyetlen szabállyal nem tudom felírni, mert a törzsben csak AND lehet, OR nem. Ehhez több szabályból álló Datalog program kell: Válasz(x 1,...,x n ) R(x 1,...,x n ) Válasz(x 1,...,x n ) S(x 1,...,x n ) Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 23
Relációs algebra és Datalog ---2 Kiválasztás: x i xj (R) kifejezésnek megfelelő szabály : Válasz(x 1,...,x n ) R(x 1,...,x n ) AND x i x j x i c(e1) kifejezésnek megfelelő szabály: Válasz(x 1,...,x n ) R(x 1,...,x n ) AND x i c Vetítés: A (R) kifejezésnek megfelelő szabály: i1,...,aik Válasz(x,...,x i 1 ik ) R(x 1,...,x n ) Megjegyzés: név nélküli anonymus változók, amelyek csak egyszer szerepelnek és mindegy a nevük azt aláhúzás helyettesítheti. Például: HosszúFilm(c,é) Film(c,é,h,_,_,_) AND h 100 Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 24
Relációs algebra és Datalog ---3 Természetes összekapcsolás: Tegyük fel, hogy R(A 1,...,A n, C 1,, C k ) és S(B 1,...,B m, C 1,, C k ) R S kifejezésnek megfelelő szabály: Válasz(x 1,...,x n,y 1,...,y m, z 1,, z k ) R(x 1,...,x n, z 1,, z k ) AND S(y 1,...,y m, z 1,, z k ) A felírt szabályok biztonságosak. Minden Q relációs algebrai kifejezéshez van nem rekurzív, biztonságos, negációt is tartalmazó Datalog program, amelyben egy kitüntetett IDB predikátumhoz tartozó kifejezés ekvivalens a Q lekérdezéssel. A nem rekurzív, biztonságos, negációt is tartalmazó Datalog kifejezőerő tekintetében EKVIVALENS a relációs algebrával. Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 25
Példa: Datalog átírása SELECT-re Szeret(Név, Gyümölcs) sémájú tábla alapján Kik szeretik az almát is és a körtét is logikai megoldását írjuk át SQL SELECT utasításra! Válasz(N) Szeret(N, alma ) AND Szeret(N, körte ) A törzs két predikátumában megegyeznek a szabad változók, ami a metszet halmazműveletnek felel meg: SELECT Név FROM Szeret WHERE Gyümölcs= alma INTERSECT SELECT Név FROM Szeret WHERE Gyümölcs= körte ; Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 26
Példa: Datalog átírása SELECT-re Az előző szabály másik ekvivalens átírása Válasz(N) Szeret(N, alma ) AND Szeret(N, körte ) Ez a szabály ugyanaz, mintha kiírnánk a változókat: Válasz(N1) Szeret(N1,Gy1) AND Szeret(N2,Gy2) AND N1=N2 AND Gy1= alma AND Gy2= körte Ennek megfelelő SELECT utasítás: SELECT s1.név FROM Szeret s1, Szeret s2 WHERE s1.név= s2.név AND s1.gyümölcs= alma AND Gyümölcs= körte ; Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 27
Az Eljut-feladat Tankönyv 10.2. fejezet példája (az ELJUT feladat) Jaratok(legitarsasag, honnan, hova, koltseg, indulas, erkezes) táblában repülőjáratok adatait tároljuk. A járatok táblát létrehozó script: http://people.inf.elte.hu/sila/eduab/jaratok_tabla.txt Mely (x,y) párokra lehet eljutni x városból y városba? Ezt egy relációs algebrai kifejezésként nem tudjuk megadni zárt alakban, klasszikus SQL SELECT utasítással sem tudjuk kifejezni, csak azt tudjuk, hogy átszállás nélkül, egy, két, stb átszállással: Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 28
Az Eljut-feladatnak nincs algebrai megoldása select distinct honnan, hova from jaratok union select j1.honnan, j2.hova from jaratok j1, jaratok j2 where j1.hova=j2.honnan union select j1.honnan, j3.hova from jaratok j1, jaratok j2, jaratok j3 where j1.hova=j2.honnan and j2.hova=j3.honnan --- union stb... Ezt így nem lehet felírni Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 29
Az Eljut-feladat Datalogban Tankönyv 10.2. fejezet példája (az ELJUT feladat) Jaratok(legitarsasag, honnan, hova, koltseg, indulas, erkezes) EDB-táblában repülőjáratok adatait tároljuk. Mely (x,y) párokra lehet eljutni x városból y városba? Datalogban felírva (lineáris rekurzió) Eljut(x, y) <- Jaratok(l, x, y, k, i, e) Eljut(x, y) <- Eljut(x, z) AND Jaratok(l, z, y, k, i, e) Vagy másképp felírva Datalogban (mi a különbség?) Eljut(x, y) <- Jaratok(_, x, y, _, _, _) --- anonimus változók Eljut(x, y) <- Eljut(x, z) AND Eljut(z, y) --- nem lineáris rek. Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 30
Az Eljut feladat SQL-99 szabványban Datalog LINEÁRIS, MONOTON rekurzió átírható: Eljut(x, y) <- Jaratok(l, x, y, k, i, e) Eljut(x, y) <- Eljut(x, z) AND Jaratok(l, z, y, k, i, e) Hova, mely városokba tudunk eljutni Budapestről? 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= Bp ; Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 31
SQL-99 szabvány: Rekurzív lekérdezés A WITH utasítás több ideiglenes relációra vonatkozó definíciója: WITH [RECURSIVE] R 1 AS <R 1 definíciója> [RECURSIVE] R 2 AS <R 2 definíciója>... [RECURSIVE] R n AS <R n definíciója> < R 1,R 2,...,R n relációkat tartalmazó lekérdezés> Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 32
Másik példa: Rekurzív Datalog A testvérek (féltestvérek) gyerekei első unokatestvérek, az első unokatestvérek gyerekei másod-unokatestvérek, és így tovább. Hívjuk egyszerűen unokatestvéreknek, akik valamilyen szinten unokatestvérek. A rokonok azok, akik közös ősnek leszármazottjai. Milyen Datalog program írja ezt le? testvér(x,y) gyerek(x,z),gyerek(y,z),x y unokatestvér(x,y) gyerek(x,z),gyerek(y,v),testvér(z,v) unokatestvér(x,y) gyerek(x,z),gyerek(y,v),unokatestvér(z,v) rokon(x,y) testvér(x,y) rokon(x,y) rokon(x,z),gyerek(y,z) rokon(x,y) rokon(z,y),gyerek(x,z) r u Függőségi gráf Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 33 t g
Másik példa: Rekurzív Datalog Mik a Datalog egyenletek? testvér(x,y) unokatestvér(x,y) unokatestvér(x,y) rokon(x,y) rokon(x,y) rokon(x,y) gyerek(x,z),gyerek(y,z),x y gyerek(x,z),gyerek(y,v),testvér(z,v) gyerek(x,z),gyerek(y,v),unokatestvér(z,v) testvér(x,y) rokon(x,z),gyerek(y,z) rokon(z,y),gyerek(x,z) A megfelelő relációk legyenek T,U,R,G a testvér, unokatestvér, rokon, illetve gyerek esetén. T(x,y)= x,y ( x y (G(x,z) >< G(y,z))) U(x,y)= x,y (G(x,z) >< G(y,v) >< T(z,v)) x,y (G(x,z) >< G(y,v) >< U(z,v)) R(x,y)=T(x,y) x,y (R(x,z) >< G(y,z)) x,y (R(z,y) >< G(x,z)) Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 34
Példa folyt:rekurzív Datalog átírása SQL-be WITH T(x,y) as (select G1.u x, G2.w y from G G1,G G2 where G1.w=G2.u and G1.u<>G2.u), RECURSIVE U(x,y) as (select G1.u x, G2.u y from G G1, G G2, T where T.x=G1.w and T.y=G2.u) UNION (select G1.u x, G2.u y from G G1, G G2, U where U.x=G1.w and U.y=G2.u), RECURSIVE R(x,y) as (select * from T) UNION (select R.x x,g.u y from R,G where R.y=G.w) UNION (select G.u x, R.y y from R,G where R.x=G.w) (select T.x, T.y, 'T' from T union select U.x, U.y, 'U' from U union select R.x, R.y, 'R' from R); Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 35
Rekurzív lekérdezések Datalog rekurzió segít megérteni az SQL-99 szabványban bevezetett rekurzív lekérdezések WITH RECURSIVE záradékát. A BSc-n csak MONOTON rekurziót vesszük, vagyis nem használjuk nem-monoton különbség műveletet, nincs csoportosítás-aggregálás (ugyanis az olyan lekérdezések, amelyek nem-monotonok, megengedik a negációt és aggregálást az olyan különös hatással van a rekurzióra, ezt csak MSc kurzusokon vesszük). Gyakorlaton a rekurzív Eljut-feladatnak az Oracle CONNECT BY záradékkal való gépes-megoldásait is megnézzük (ezt csak a gyakorlaton próbáljuk ki). Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 36
Eljut feladat PL/SQL-ben ---1 Rek1.feladat: Mely (x, y) várospárokra lehet egy vagy több átszállással eljutni x városból y városba? Ehhez hozzuk létre eljut(honnan,hova) 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 sorait a járatok tábla alapján (ehhez ciklust szervezni, az insert több sor felvitele 2.alakja alkérdéssel járatok és eljut táblák alapján) Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 37
Eljut feladat PL/SQL-ben ---2 Az ELJUT feladat megoldása Oracle PL/SQL-ben A ciklus során ellenőrizni kell, hogy addig hajtsuk végre a ciklust, amíg növekszik az eredmény (Számláló) DECLARE RegiSzamlalo Integer; UjSzamlalo Integer; Deklarációs rész után BEGIN END; között az utasítások, először az eljut táblának kezdeti értéket adunk (a megvalósításnál az INSERT-nél figyelni, hogy ne legyenek ismétlődő sorok: select distinct) delete from eljut; insert into eljut (SELECT distinct honnan, hova FROM jaratok); Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 38
Eljut feladat PL/SQL-ben ---3 Szamlalo változóknak adunk kiindulási értéket: RegiSzamlalo := 0; select count(*) into UjSzamlalo from eljut; A ciklust addig kell végrehajtani, amíg növekszik az eredmény (Szamlalo) duplikátumokra figyelni! LOOP insert into eljut (lásd a köv.oldalon ) select count(*) into UjSzamlalo from eljut; EXIT WHEN UjSzamlalo = RegiSzamlalo; RegiSzamlalo := UjSzamlalo; END LOOP; commit; Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 39
Eljut feladat PL/SQL-ben ---4 Az eljut tábla növelése a ciklusban, figyelni kell a duplikátumokra, csak olyan várospárokat vegyünk az eredményhez, ami még nem volt! insert into eljut (select distinct eljut.honnan, jaratok.hova from eljut, jaratok --- *from (lineáris rekurzió) where eljut.hova = jaratok.honnan and (eljut.honnan,jaratok.hova) NOT IN (select * from eljut)); Megjegyzés: PSM-ben a nem-lineáris rekurzió is megengedett: from eljut e1, eljut e2 ---*from-ban Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 40
Eljut feladat PL/SQL-ben ---5 Rek2.feladat: Mely (x,y) város párokra hány darab átszállással és milyen költségekkel lehetséges egy vagy több átszállással eljutni x városból y városba? Ehhez készítsünk Eljut2(honnan, hova, atszallas, koltseg) táblát. Írjunk egy olyan PL/SQL programot, ami feltölti az ELJUT táblát. 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, ami azt jelenti, hogy ha több járattal utazunk, akkor nézni kell átszálláskor az érkező járatnak legalább egy órával a rákövetkező indulás előtt meg kell érkeznie, és 6 óránál ne kelljen többet várnia. Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 41
Oracle megoldások: with utasítással Az Oracle SQL a WITH RECURSIVE utasítást (UNION) nem támogatja, ott másképpen oldották meg WITH utasítással (Oracle 11gR2 verziótól használható) WITH eljut (honnan, hova) as (select honnan, hova from jaratok UNION ALL select jaratok.honnan, eljut.hova from jaratok, eljut where jaratok.hova=eljut.honnan ) SEARCH DEPTH FIRST BY honnan SET SORTING CYCLE honnan SET is_cycle TO 1 DEFAULT 0 select distinct honnan, hova from eljut order by honnan; Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 42
Oracle megoldások: connect by SELECT DISTINCT hova FROM jaratok WHERE HOVA <> 'DAL' START WITH honnan = 'DAL' CONNECT BY NOCYCLE PRIOR hova = honnan; SELECT LPAD(' ', 4*level) honnan, hova, level-1 Atszallasok, sys_connect_by_path(honnan '->' hova, '/'), connect_by_isleaf, connect_by_iscycle FROM jaratok START WITH honnan = 'SF' CONNECT BY NOCYCLE PRIOR hova = honnan; Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 43
Csak a gyakorlatra (Oracle Példatár) Oracle megoldások 2.7.lecke Hierarchical Retrieval After completing this lesson, you should be able to do the following: Interpret the concept of a hierarchical query Create a tree-structured report Format hierarchical data Exclude branches from the tree structure Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 44
Sample Data from the EMPLOYEES Table Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 45
(Oracle) Natural Tree Structure MANAGER_ID = 100 (Child) EMPLOYEE_ID = 100 (Parent) King Kochhar De Haan Mourgos Zlotkey Hartstein Whalen Higgins Hunold Rajs Davies Matos Vargas Gietz Ernst Lorentz Abel Taylor Grant Fay Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 46
(Oracle) Hierarchical Queries SELECT [LEVEL], column, expr... FROM table [WHERE condition(s)] [START WITH condition(s)] [CONNECT BY PRIOR condition(s)] ; WHERE condition: expr comparison_operator expr Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 47
(Oracle) Walking the Tree Starting Point Specifies the condition that must be met Accepts any valid condition START WITH column1 = value Using the EMPLOYEES table, start with the employee whose last name is Kochhar....START WITH last_name = 'Kochhar' Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 48
(Oracle) Walking the Tree CONNECT BY PRIOR column1 = column2 Walk from the top down, using the EMPLOYEES table.... CONNECT BY PRIOR employee_id = manager_id Direction Top down Bottom up Column1 = Parent Key Column2 = Child Key Column1 = Child Key Column2 = Parent Key Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 49
(Oracle) Walking the Tree: From the Bottom Up SELECT employee_id, last_name, job_id, manager_id FROM employees START WITH employee_id = 101 CONNECT BY PRIOR manager_id = employee_id ; Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 50
(Oracle) Walking the Tree: From the Top Down SELECT last_name ' reports to ' PRIOR last_name "Walk Top Down" FROM employees START WITH last_name = 'King' CONNECT BY PRIOR employee_id = manager_id ; Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 51
(Oracle) Ranking Rows with the LEVEL Pseudocolumn Level 1 root/parent King Kochhar De Haan Mourgos Zlotkey Hartstein Whalen Higgins Hunold Rajs Davies Matos Vargas Level 3 parent/child /leaf Fay Gietz Ernst Lorentz Abel Taylor Grant Level 4 leaf Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 52
(Oracle) Formatting Hierarchical Reports Using LEVEL and LPAD Create a report displaying company management levels, beginning with the highest level and indenting each of the following levels. COLUMN org_chart FORMAT A12 SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-2,'_') AS org_chart FROM employees START WITH last_name='king' CONNECT BY PRIOR employee_id=manager_id Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 53
(Oracle) Pruning Branches Use the WHERE clause to eliminate a node. Use the CONNECT BY clause to eliminate a branch. WHERE last_name!= 'Higgins' CONNECT BY PRIOR employee_id = manager_id AND last_name!= 'Higgins' Kochhar Kochhar Whalen Higgins Whalen Higgins Gietz Gietz Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 54
Kérdés/Válasz Köszönöm a figyelmet! Kérdés/Válasz? Vizsgára ismerni/ismertetni kell az Eljut feladatot és az SQL-99 szabvány WITH RECURSION utasítását, továbbá feladatok lesznek Datalog program átírására SELECT-re WITH RECURSION záradékkal (SQL-99) Házi feladat: Gyakorlás Oracle Példatár 3.fejezete tartalmaz hierarchikus lekérdezésekre feladatokat: http://people.inf.elte.hu/sila/eduab/feladatok.pdf Oracle gépes-megoldások nem lesznek a vizsgán, csak a gyakorlaton próbáljuk ki: az Eljut-feladathoz a Jaratok táblát létrehozó script: create_jaratok_tabla.txt Adatbázisok-1 (Hajas Csilla, ELTE IK) 7.előadáshoz kieg.: Datalog, Rekurzió 55