10 .FELADATSOR
(INFORMÁCIÓS RENDSZEREK)
További haladó
témakörök: Hierarchikus, gráfos
adatszerkezetek
(a)
Hierarchikus adatszerkezetek lekérdezése, Oracle CONNECT BY
(b)
Gráfok, rekurzió: with recursive SQL szabványban és Oracle-ben
(c)
További lehetőségek,
érdekességek (nem tananyag,
opcionális)
(a) Hierarchikus
adatszerkezetek
lekérdezése:
1.) Hierarchikus lekérdezések,
CONNECT BY, például
családfák
lekérdezése.
>> Oracle: SQL12_hiera_lekerd.pdf;
-- példákhoz: create_hr_synonym.txt
>> Oracle: LiveSQL
Tutorial_HieraQueries.html
>> Oracle
Példatár 3.fej.
Hierarchikus
lekérdezések: peldatar_62-65o.pdf
>> Oracle DB SQL Lang.
Ref. 12.2: Hierarchical
Queries html (Examples)
SQL Hierarchikus
függvények: sys_connect_by_path
html (Examples)
SELECT
... FROM... WHERE ... START WITH ... CONNECT BY PRIOR ...
-- Az Oracle SQL Lang.Ref. 9.fej. SELECT példáit
írjuk át,
lépésenként...
select dkod, dnev, fonoke from dolgozo;
select dkod, dnev, fonoke, level
from dolgozo
start with dkod = 7839 -- 'KING'
--
(select dkod from dolgozo where dnev='KING')
connect by prior dkod = fonoke;
-- Ha a fát felülről-lefelé,
előrefelé járjuk be:
select dkod, dnev, fonoke, level
from dolgozo
start with dkod = 7566 -- 'JONES'
connect by prior dkod = fonoke;
-- Ha a fát alulról felfelé,
visszafelé járjuk be:
select dkod, dnev, fonoke, level
from dolgozo
start with dkod = 7566 -- 'JONES'
connect by prior fonoke = dkod;
-- SQL Lang.Ref. 7.fej. SYS_CONNECT_BY_PATH fv-re való
példát is írjuk át:
select dkod, dnev, fonoke, level,
LPAD(' ', 2*level-1)||SYS_CONNECT_BY_PATH(dnev, '/')
"Útvonal"
from dolgozo
start with dkod = (select dkod
from dolgozo where dnev='KING')
connect by prior dkod = fonoke;
(b)
Gráfok lekérdezése, rekurzió: SQL
WITH RECURSIVE utasítás
2.) Az Eljut-feladat a
Tankönyv
(Ullman-Widom kék
könyv) 10.2 szakaszára épül
Adott Jaratok(legitarsasag,
honnan, hova, koltseg, indulas, erkezes) táblában
repülőjáratok
adatait
tároljuk (honnan-hova várospárok). Azt
keressük, hogy
Dallasból
mely városokba tudunk eljutni
(közvetlenül vagy
egy/több átszállással).
>> Ullman-Widom
tankönyv 10.2 szakasza Eljut-feladat:
korábbiEA/p67_p80.pdf
>> Oracle: SQL Language Reference
>> innen: Recursive
Subquery
Factoring
>> Az Ullman-Widom
Tankönyv szerint (SQL szabvány szerint, csak
papíron)
(konkrét
adatbázis-kezelő rendszerekben eltérő
megvalósítások lehetnek)
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';
3.) Az Eljut feladat gépes
megvalósítása Oracle-ben:
-- Ezzel a
scripttel jaratok_tabla.txt
készítsünk saját
táblát.
>> Az SQL-99 szabványhoz
képest az eltérések, hogy WITH
RECURSIVE helyett
az Oracle-ben csak WITH,
és a UNION az Oracle-ben nem megy, hanem csak
UNION ALL működik,
és nem-hierarchikus esetben meg kell adni a CYCLE-t
is:
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;
--
visszatérve: ORACLE CONNECT BY
megoldásra, KIEG.:
4.) Eljut feladat amíg
nincs kör, hierarchikus
lekérdezéssel működik
>> Ha kör van a
gráfban, akkor NOCYCLE
kiegészítéssel már
működik
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;
(c) További
lehetőségek (nem-tananyag,
opcionális szorgalmi)
>> Reguláris
kifejezések: SQL_regularis_kif.txt;
SQL_regular_exp.pdf
>> Analitikus
függvények: Oracle
Példatár 13.fej.; Tutorial:
Analytic Funct.