PDA

View Full Version : [SQL] Select termine da tabella con confronto con valori di altre tabelle


phantom85
12-11-2009, 09:57
Ciao a tutti, ho un problema con una query SQL.

Ho 2 tabelle contenenti nomi di sportivi. La prima tabella contiene nomi di calciatori, la seconda contiene nomi di pallavolisti.

Le due tabelle si chiamano: CALCIO-PALLAVOLO

e hanno solo 2 colonne ciascuna: id e nome

Il web service che ho fatto analizza un testo ed estrae dei nomi, poi li inserisce nelle 2 rispettive tabelle.

Successivamente devo estrarre i nomi presenti nella tabella CALCIO, che non sono presenti anche nella tabella PALLAVOLO.


La query che ho scritto è questa:

SELECT nome FROM calcio
WHERE nome <> (SELECT nome FROM pallavolo) INTERSECT (SELECT nome FROM calcio);

Il problema è che se nella tabella pallavolo ho 2 nomi o più mi dice

"more than one row returned by a subquery used as an expression"


Mi aiutate a correggere la query? :help:

phantom85
12-11-2009, 10:25
edit:

ho realizzato questa query


SELECT DISTINCT nome FROM calcio,pallavolo
GROUP BY calcio,pallavolo
HAVING calcio.nome <> pallavolo.nome;



e funziona...il problema è che se la tabella pallavolo è vuota non stampa nulla, mentre invece vorrei che stampasse comunque il nome presente nella tabella calcio!

Caldwell83
12-11-2009, 10:30
Se stai usando un DB che ha l'operatore "minus" puoi fare:
select nome from calcio
minus
select nome from pallavolo

phantom85
12-11-2009, 10:44
Se stai usando un DB che ha l'operatore "minus" puoi fare:
select nome from calcio
minus
select nome from pallavolo


Mitico, mi hai fatto ricordare dell'operatore EXCEPT che c'è in Postgres...ora faccio subito la prova ;)

Speriamo bene...

phantom85
12-11-2009, 13:52
Ok con l'except funziona, grazie mille ;)


Ora vorrei fare un ulteriore upgrade alla query.


Ho un'altra tabella LISTA che contiene anch'essa due colonne: id, nome.


Vorrei che la query estraesse i nomi presenti sempre nella tabella CALCIO, ma non contenuti nella tabella PALLAVOLO e che il nome non faccia parte del campo nome della tabella LISTA.


Ad esempio:


CALCIO
01 Mauro Bianchi
02 Carlo Rossi
03 Stefano Verdi


PALLAVOLO
01 Mauro Bianchi
02 Luca Neri

LISTA

01 Gian Carlo Rossi
02 Piero Gialli

La query dovrà estrarre solo Stefano Verdi, perchè Mauro Bianchi è presente nella tabella PALLAVOLO e Carlo Rossi è parte di un nome contenuto in LISTA.

Come potrei fare??

Esiste l'operatore LIKE che permette di settare dei pattern per fare delle verifiche, però non sapendo a priori il pattern, come posso fare??

Grazie ;)

phantom85
13-11-2009, 15:36
Non c'è una soluzione?? :help: