|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Apr 2007
Messaggi: 153
|
[sql]query per preparazione esame
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 è Codice:
Attori(CodiceAtt, Nome, AnnoNascita); AttoriFilm(CodiceAtt*, CodiceFilm*) Film(CodiceFilm, Titolo, AnnoProduzione, Regista) Proiezioni(CodiceFilm*, CodiceSala*, Incasso, DataProiezione) Sala(CodiceSala, Posti, Nome, Citta) 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 Codice:
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)); 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 |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
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’
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Apr 2007
Messaggi: 153
|
Ho capito, grazie mille, sei stato chiarissimo
![]() |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Apr 2007
Messaggi: 153
|
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 :
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; |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Apr 2007
Messaggi: 153
|
up
|
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Jul 2008
Città: Nel mio studio
Messaggi: 168
|
Manca il controllo sulla città (Pisa in questo caso)
__________________
Since Rocco Siffredi, the saying "pain in the ass" got a total new meaning |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:42.