-- Primeri upita koji su različita rešenja istog problema i imaju različite performanse

--==========================================================================================================================
--Zadatak: izdvojiti parove imena i prezimena studenata cije su prosecne
--ocene (u tabeli ispita) vece od polovine prosecne ocene svih studenata u tabeli ispita

select A.ime,A.prezime, B.ime, B.prezime, C.prosek
from
    (select x.indeks,ime, prezime, avg(ocena*1.0) as prosek
     from   ispit x, dosije y 
     where  x.indeks=y.indeks
     group  by x.indeks, ime, prezime
    ) as    A,
    (select x.indeks,ime, prezime, avg(ocena*1.0) as prosek
     from   ispit x, dosije y 
     where  x.indeks=y.indeks
     group  by x.indeks, ime, prezime
    ) as    B,    
    (select avg(ocena*1.0) as prosek
     from   ispit
    ) as    C
where  A.prosek>C.prosek/2
and    B.prosek>C.prosek/2
and    A.indeks  <B.indeks;
 

--Aleternativno rešenje
with 
A(indeks,ime,prezime,prosek) 
as
(select x.indeks,ime, prezime, avg(ocena*1.0) 
 from   ispit x, dosije y 
 where  x.indeks=y.indeks
 group  by x.indeks, ime, prezime
),  
--Tabela BB mora da se javi pre tabele B u kojoj se poziva tabela BB. U suprotnom se javlja greška
BB(indeks,prosek)
as
(select indeks,avg(ocena*1.0) as prosek
 from   ispit
 group  by indeks
),
B(indeks, ime, prezime, prosek)
as
(select dosije.indeks,ime, prezime,prosek
 from   dosije, BB
 where dosije.indeks=BB.indeks
),
C
as
(select avg(ocena*1.0) as prosek
 from   ispit
) 

select A.ime,A.prezime, B.ime, B.prezime, C.prosek
from   A, B, C
where  A.prosek>C.prosek/2
and    B.prosek>C.prosek/2
and    A.indeks  <B.indeks;

--==========================================================================================================================
--Prikazati broj indeksa, ime, prezime i naziv predmeta za koje vazi da je student sa tim 
--brojem indeksa, imenom i prezimenom polozio ispit iz tog predmeta u 
--ispitnom roku ciji je naziv 'April 2015' ili 'Jun 2015'
select indeks, ime, prezime, naziv
from   dosije a, predmet b
where  a.indeks in (     
                    select c.indeks 
                    from   ispit c
                    where  (godina_roka, oznaka_roka) in (
                                                          select godina_roka, oznaka_roka
                                                          from   ispitni_rok
                                                          where  naziv in ('April 2015','Jun 2015')                                                          
                                                         )
                    and    c.id_predmeta=b.id_predmeta   
                    and    c.ocena>5   
                   );

--Alternativni upit 
select indeks, ime, prezime, naziv
from   dosije a, predmet b
where  (a.indeks,b.id_predmeta)  in 
                   (     
                    select c.indeks, c.id_predmeta
                    from   ispit c
                    where  (c.godina_roka, c.oznaka_roka) in (
                                                              select godina_roka, oznaka_roka
                                                              from   ispitni_rok
                                                              where  naziv in ('April 2015','Jun  2015')                                                          
                                                             )
                    and    c.ocena>5   
                   );

