Dotazovací jazyky I - řešení

Z ωικι.matfyz.cz
Přejít na: navigace, hledání

Zkoušky[editovat | editovat zdroj]

17.1.2008 (zadanie)[editovat | editovat zdroj]

  • 1.)
vybrat všetkých hercov, ktorí hrali vo vsech filmoch režírovaných Formanom
čo je inak povedané: všetci herci pre ktorých neexistuje Formanov film, v ktorom nehrali -- vyber mená hercov.. SELECT H.Jméno FROM Hraje_v HV JOIN Herec H ON H.HerecId = HV.HerecId -- ..pre ktorých neexistuje Formanov film v ktorom nehrali WHERE NOT EXIST ( -- vyber Formanove filmy, v ktorých nehral herec H.HerecId SELECT F2.FilmId FROM Film F2 JOIN Hraje_v HV2 ON HV2.HerecId = F2.HerecId WHERE F2.Režisér = 'Forman' -- herec nie je v zozname hercov, ktorý hrali v tomto filme AND H.HerecId NOT IN ( -- vyber všetkých herov ktorí hrali v tomto konkrétnom filme SELECT HV3.HerecId FROM Hraje_v HV3 WHERE F2.FilmId = HV3.FilmId ) )
vybrat všetkých režisérov, kteří nehrali v žiadnom svojom filme
čo je inak povedané: vyber zoznam (reláciu) taký v ktorom bude pre každého režiséra zoznam hercov, ktorý hrali v niektorom jeho filme a ak je meno herca a meno režiséra rovnaké, tak tohto režiséra nechceme vo výslednom zozname SELECT F.Režisér --, H.Jméno FROM Film F JOIN Hraje_v HV ON HV.FilmId = F.FilmId JOIN Herec H ON H.HerecId = HV.HerecId WHERE F.Režisér <> H.Jméno -- v zadaní bolo, že dom(Režisér) = dom(Jméno)

POZOR: osobne si myslim, ze tohle nebude fungovat, ptz to vybere i filmy, kde reziser hraje, ale hraje tam take nekdo jiny (jelikoz se pro kazdy par film-herec vytvori jeden radek). Spise bych to videl pres NOT IN


7.) stačí použiť sedliacky rozum a uvodomiť si, že keď spájam relácie R a S, tak nezáleží na poradí

((R[B=C]S)[D=E]T)[A] -> (   T[E][E=D]( R[B=C]S[ACD] ) )[A]
                     -> (   T[E][E=D]( S[ACD][C=B]R ) )[A]
                     -> ( ( T[E][E=D]S[ACD] )[C=B]R )[A]


3.2.2009 (zadání)[editovat | editovat zdroj]

5) Následující řešení (nakolik jsem si ho dobře zapamatoval) mi bylo uznáno na zkoušce 15.1.2013.

-- pomocná struktura pro jméno (zajistí, aby dom(Film.Reziser) == dom(Herec.Jmeno))
Create Row Type jmeno_t (krestni Varchar(20), prijmeni Varchar(20));
Create Type film_t As (FilmId Integer, Titul Varchar(10), Reziser jmeno_t) Instantiable Final Ref FilmId;
-- předek pro všechny osoby (příprava pro nové "druhy" osob)
Create Type osoba_t As (RodneCislo Varchar(10), Jmeno jmeno_t) Not Final;
Create Type herec_t As Under osoba_t(
 HerecId Integer, 
 Adresa Row(stat Varchat(30), mesto Varchar(30), ulice Varchar(30), cisloDomu Varchar(10), psc Varchar(10)), 
 Filmy Ref(film_t) Set) Instantiable Final Ref HerecId;

Create Table Film Of film_t (Primary Key FilmId);
Create Table Herec Of herec_t (Primary Key HerecId, Filmy With Option Scope Film);

-- v dotazu je nutné odhnízdit danou kolekci
Select h.HerecId, Count(f.film) From Herec h, Unnest(h.Filmy) As f(film)
 Where f.film->Reziser.prijmeni='Forman' Group By h.HerecId;