PDA

View Full Version : [sql]query per preparazione esame


braian
15-08-2008, 11:58
Sto preparando l'esame di basi dati e utilizzo sempre un database riempito da me su cui posso scrivere le query di cui ho le soluzioni.
Il database è

Attori(CodiceAtt, Nome, AnnoNascita);
AttoriFilm(CodiceAtt*, CodiceFilm*)
Film(CodiceFilm, Titolo, AnnoProduzione, Regista)
Proiezioni(CodiceFilm*, CodiceSala*, Incasso, DataProiezione)
Sala(CodiceSala, Posti, Nome, Citta)

Dove le sottolineature denotano chiavi primarie e gli asterischi chiavi esterne.

La query che devo scrivere è la seguente:
Restituire il nome ed il codice di tutte le sale di Pisa in cui ogni proiezione del film con codice 100 che `e avvenuta il 10/12/2001 ha incassato almeno 300.000

Le soluzioni possibili che mi vengono date sono

SELECT s.Nome, s.CodiceSala
FROM Sale s
WHERE s.Citta = ’Pisa’ AND
(FOR ALL p IN Proiezioni
WHERE p.CodiceSala=s.CodiceSala AND p.CodiceFilm = 100
AND p.DataProiezione = ’10/12/2001’
: p.Incasso >= 300000);

oppure

SELECT s.Nome, s.CodiceSala
FROM Sale s
WHERE s.Citta = ’Pisa’ AND
NOT EXISTS (
SELECT *
FROM Proiezioni p
WHERE p.CodiceSala=s.CodiceSala AND p.CodiceFilm = 100
AND p.DataProiezione = ’10/12/2001’
AND NOT(p.Incasso >= 300000));


Vorrei sapere secondo voi se è accettabile una query scritta così:

select s.nome,s.codicesala
from film f, sale s, proiezioni p
where f.codicefilm=p.codicefilm and s.codicesala=p.codicesala and f.codicefilm=100 and s.citta='Pisa' and p.incasso>300000 and p.dataproiezione = ’10/12/2001’;

visto che sembra produrre gli stessi risultati.
Grazie

gugoXX
15-08-2008, 22:28
Ciao.
L'ultima non va bene.
E' richiesto che tutte le proiezioni di quel film debbano avere incassato piu' di 300.000
Tu invece con l'ultima staresti restituendo una sala se "almeno" una proiezione ha incassato piu' di 300.000.
Peggio, ogni sala la staresti restituendo piu' volte, una per ciascuna proiezione (se previsto)

Le altre 2 invece vanno bene, la seconda e' piu' comune nei database commerciali.

Prova ad inserire nel DB una proiezione con incasso meno di 300.000 in una qualsiasi sala che ne abbia almeno un'altra con piu' di 300.000
Non dovrebbe venire fuori, ma la tua query la restituirebbe.

PS: Se DataProiezione e' un campo in formato Data, o c'e' un errore o ce n'e' un altro:
1- Se contiene solo date precise, senza ore-min-sec, allora la tabella Proiezioni non ha una chiave primaria corretta, in quanto si suppone che una sala possa proiettare lo stesso film per piu' volte al giorno
2- Se invece e' previsto che tale campo debba avere anche HH-MM-SS, per soddisfare il requisito di cui sopra, allora sono sbagliate le query, poiche' nessuna proiezione avverra' mai nell'istante preciso ’10/12/2001’ (che sarebbe la mezzanotte), e occorrerebbe cambiare le query con una Between
... AND DataProiezione Between ’10/12/2001’ and ’11/12/2001’

braian
17-08-2008, 07:56
Ho capito, grazie mille, sei stato chiarissimo:)

braian
07-09-2008, 13:51
Vorrei sapere se, sempre per la query Restituire il nome ed il codice di tutte le sale di Pisa in cui ogni proiezione del film con codice 100 che `e avvenuta il 10/12/2001 ha incassato almeno 300.000 sul database riportato nel primo post può andare bene questo codice :



SELECT s.Nome, s.CodiceSala
FROM Sale s, Proiezioni p
WHERE s.CodiceSala = p.CodiceSala and p.CodiceFilm = 100 and p.DataProiezione = ’10/12/2001’
GROUP BY s.Nome, s.CodiceSala
HAVING MIN(s.Incasso)>=300000;


Grazie

braian
07-09-2008, 21:24
up

Big Bamboo
08-09-2008, 11:28
Manca il controllo sulla città (Pisa in questo caso)