View Full Version : [SQL] piccolo problemino con query con NOT EXISTS
manowar84
24-05-2006, 12:53
Salve ragazzi, ho un piccolo problemino per l'uni spero mi possiate aiutare.
Ho queste 2 tabelle:
Studenti( matricola, cognome, nome)
Esami(studente, materia, voto, giorno)
(sottolineate sono le chiavi).
Devo trovare matricola, cognome e noe degli studenti che hanno preso TUTTI 30.
io ho immaginato una cosa simile:
SELECT S1.matricola, S1.cognome, S1.nome
FROM Studenti S1 join Esami E2 on E2.studente = S1.matricola
WHERE NOT EXISTS ( select E2.studente, E2.materia
from Esami E2
where E2.voto < 30 )
però mi ritorna sempre valore vuoto. Credo non ci sia corrispondenza fra il primo e secondo blocco. Ho provato ad inserire un join ma niente da fare.
Mi sapete dare una mano? thx!
manowar84
24-05-2006, 13:49
ho provato anche così:
select *
from Studenti S1
where not exists(
select S1.matricola, S1.cognome, S1.nome
from Esami E2 join Studenti S1 on E2.studente = S1.matricola
where E2.voto < 30)
ma esce fuori sempre lo stesso risltato vuoto. Il bello è che la seconda select funziona, mi da quelli che non hanno preso 30 ma poi non funziona.... :muro:
Perchè invece di fare tutti sti giri che fanno venire mal di testa non controlli semplicemente chi ha una media = 30? :confused:
Del tipo (l'ho provato in mysql):
SELECT esami.studente, studenti.nome, studenti.cognome
FROM esami, studenti
WHERE esami.studente = studenti.matricola
GROUP BY esami.studente
HAVING AVG(esami.voto) = 30;
...direttive professoresche?
'iao
manowar84
24-05-2006, 15:39
sai che non ci avevo pensato in effetti è vero!
ora provo e ti faccio sapere!
(io uso ibm db2 ma è lo stesso! :D )
beppegrillo
24-05-2006, 15:48
Prova così
select *
from Studenti S1
where not exists(
select *
from Esami E2 join Studenti S1 on E2.studente = S1.matricola
where E2.voto < 30)
manowar84
24-05-2006, 15:54
Prova così
select *
from Studenti S1
where not exists(
select *
from Esami E2 join Studenti S1 on E2.studente = S1.matricola
where E2.voto < 30)
già provato, da una query vuota.. :(
sto provando a fare come dice orphen, mi da qualche errore ma non demordo! :D
thx cmq! :)
beppegrillo
24-05-2006, 15:55
già provato, da una query vuota.. :(
sto provando a fare come dice orphen, mi da qualche errore ma non demordo! :D
thx cmq! :)
mi eseguiresti le due query separatamente con i rispettivi output? :)
manowar84
24-05-2006, 16:09
ho risolto!! calcola che la seconda parte (ovvero quella che trova quelli che non hanno voti = 30) funzionava, bisogna specificare una condizione nel secondo where.
select *
from Studenti S1
where not exists(
select S2.matricola, S2.cognome, S2.nome
from Esami E2 join Studenti S2 on E2.studente = S2.matricola
where E2.voto < 30
and S1.matricola = S2.matricola
)
ora però voglio provare anche con l'having! thx to all!
manowar84
24-05-2006, 17:11
mi sto impazzndo con la prima soluzione che mi avete proposto.
ho prvato con average del tipo:
select distinct Studenti.matricola, Studenti.cognome, Studenti.nome
from Studenti join Esami on Studenti.matricola = Esami.studente
group by Esami.studente
ma non va, mi da errore quando aggiungo il group by. Ho omesso l'having per vedere se funzionava ma non capisco cosa ci sia di sbagliato... esperti che dite? :D
manowar84
24-05-2006, 17:18
edit:
ok risolto, dovevo mettere tutto nel group by!
di nuovo grazie a tutti!!
figurati e scusa per il problema del group by, quando ho pensato alla soluzione non mi era proprio passato per la testa!
'iao
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.