
## Zkoušky ##

### 17.1.2008 ([[Dotazovací_jazyky_I#17.1.2008|zadanie]]) ###

*1.)
<dl compact>

<dt>vybrat všetkých hercov, ktorí hrali vo vsech filmoch režírovaných Formanom
<dd>č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
                                            )

                  )
<dt>vybrat všetkých režisérov, kteří nehrali v žiadnom svojom filme

<dd>č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)

</dl>
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 ([[Dotazovací_jazyky_I#3.2.2009|zadání]]) ###

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;
