[mysql] problema query

domenica 19 ottobre 2008 - 12.30

iako17 Profilo | Newbie

Ciao ragazzi,

scusate la domanda elementare, ma non riesco proprio a risolvere il mio problema.

Ho due tabelle:
aula(id,dip,......) con chiave primaria id e dip
lab(......id,dip) con chiave esterna id e dip

ora voglio selezionare tutte le aule che non sono lab.

Ho fatto in questo modo:
Select * from aula minus select * from laboratorio;

ma niente.

Qualcuno è in grado di darmi suggerimenti.
Ciao e grazie

lbenaglia Profilo | Guru

>Ho due tabelle:
>aula(id,dip,......) con chiave primaria id e dip
>lab(......id,dip) con chiave esterna id e dip
>
>ora voglio selezionare tutte le aule che non sono lab.

Non conosco MySQL ma in Access, Oracle o SQL Server utilizzerei una di queste 3 soluzioni:

SELECT * FROM aula AS A WHERE NOT EXISTS( SELECT * FROM lab WHERE id = A.id ); SELECT * FROM aula WHERE id NOT IN( SELECT id FROM lab ); SELECT A.* FROM aula AS A LEFT JOIN lab AS L ON A.id = L.id WHERE L.id IS NULL;

>Ciao e grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

iako17 Profilo | Newbie

Ma il problema è che la chiave primaria è un campo composto da due valori: nome(che prima ho chiamato id) e dipartimento.

Dovrei dunque selzionaretutte le aula che non hanno una corrispondenza, in base a nome e dipartimento, nella tabella lab.

Se utilizzo la not exists mi restituisce empty set.

Ho provato a fare in questo modo, sembra funzionare ma non sono certo che sia corretto:

select * from aula as a
left join lab as l on (a.id = lab.id and a.dip = l.dip)
where (l.id is null and l.dip is null)



lbenaglia Profilo | Guru

>Ma il problema è che la chiave primaria è un campo composto da
>due valori: nome(che prima ho chiamato id) e dipartimento.

Dato che id rappresenta generalmente un identificatore univoco ho dato per scontato che fosse la PK delle tabelle.
La prossima volta posta i comandi di CREATE TABLE completi di constraints.

>Se utilizzo la not exists mi restituisce empty set.
Questo è il comando corretto:
SELECT * FROM aula AS A WHERE NOT EXISTS( SELECT * FROM lab WHERE nome = A.nome AND dip = A.dip );

>Ho provato a fare in questo modo, sembra funzionare ma non sono
>certo che sia corretto:
>
>select * from aula as a
> left join lab as l on (a.id = lab.id and a.dip = l.dip)
>where (l.id is null and l.dip is null)
La clausola WHERE può essere semplificata verificando la nullability per una qualunque colonna della tabella lab:

SELECT A.* FROM aula AS A LEFT JOIN lab AS L ON A.nome = L.nome AND A.dip = L.dip WHERE L.nome IS NULL;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

iako17 Profilo | Newbie

Perfetto!!!!
Sei un grande.....

ciao e grazie
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5