SubQuery

venerdì 27 aprile 2007 - 22.52

antcru Profilo | Newbie

Ciao a tutti,
sono nuovo del forum e anche dei database.
Vorrei eseguire una query annidata dove la subquery mi restituisce due colonne, ma mi da errore. Vi ripoto query e errore, se riuscite aiutatemi.
P.s lavoro sotto ACCES
Grazie


select DISTINCT gestori.nome,gestori.codice
from gestori,tariffa
where gestori.codice = tariffa.gestore
AND (tariffa.codice,tariffa.gestore) NOT IN (select tariffa,gestore FROM contratto);

ERRORE:
E' stata scritta unasottoquery che puo' restituisce piu' campi senza utilizzare la parola riservata EXISTS nella proposizione FROM della query principale. Modificare l'istruzione SELECT nella sottoquery per richiedere soltanto un campo.

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao!

>sono nuovo del forum e anche dei database.
Benvenuto su DotNetHell!

>Vorrei eseguire una query annidata dove la subquery mi restituisce
>due colonne, ma mi da errore. Vi ripoto query e errore, se riuscite
>aiutatemi.
>P.s lavoro sotto ACCES

>select DISTINCT gestori.nome,gestori.codice
>from gestori,tariffa
>where gestori.codice = tariffa.gestore
>AND (tariffa.codice,tariffa.gestore) NOT IN (select tariffa,gestore
>FROM contratto);
>
>ERRORE:
>E' stata scritta unasottoquery che puo' restituisce piu' campi
>senza utilizzare la parola riservata EXISTS nella proposizione
>FROM della query principale. Modificare l'istruzione SELECT nella
>sottoquery per richiedere soltanto un campo.
L'ultimo messaggio è quello che ti dovrebbe far capire l'errore..
non puoi fare una query nella forma:

SELECT * FROM Tabella1 WHERE campo1,campo2 NOT IN (SELECT campo1,campo2 FROM Tabella2)

l'operatore IN (o not in) permette di controllare se un particolare campo sta all'interno di una lista di valori.
Quindi, solo un campo, in questo modo:

SELECT * FROM Tabella1 WHERE campo1 NOT IN (SELECT campo1 FROM Tabella2)

Detto questo, leggiti il link sui books online, l'operatore IN
http://msdn2.microsoft.com/en-us/library/ms177682.aspx

Comunque, anche se non conosco la tua situazione reale, dovrebbe bastare scrivere la tua query così:
SELECT DISTINCT gestori.nome, gestori.codice FROM gestori,tariffa WHERE gestori.codice = tariffa.gestore AND tariffa.codice NOT IN (select tariffa contratto) AND tariffa.gestore NOT IN (select gestore contratto);

ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

antcru Profilo | Newbie

Grazie per la celere risposta
Ho capito che non posso usare l'operatore NOT IN, ma, purtroppo,la query che mi hai mandato non è adatta al mio caso.
Forse chiedo troppo, ma questo è il mio modello logico

Gestori(Codice,Nome) Primary key(codice)
Tariffa(Codice, gestore,DataAttivazione,CostoBase) Primary key(codice,gestore)
Contratto(Tariffa,gestore,Cliente) Primary key(codice,gestore,cliente)


devo ristrovare tutti i gestori che offrono almeno una tariffa che non compare in alcun contratto.
Il problema è che la chiave primaria di tariffa è composta sia dal codice della tariffa che dal codice del gestore, quindi quando vado a ricercare in contratto le tariffe di cui non ho stipulato contratti devo confronatrla con entrambi.
Non so se mi sono spiegato

grancati Profilo | Newbie

>Ho capito che non posso usare l'operatore NOT IN, ma, purtroppo,la query che mi hai >mandato non è adatta al mio caso.
[CUT]

Ciao,

Alx81 ti ha già spiegato che l'operatore IN non si può usare uin quel modo.
Le subquery in Access riducono drasticamente le prestazioni, riscriviamo la query in Sql Ansi92

----
Select DISTINCT gestori.nome,gestori.codice
from (gestori INNER JOIN tariffa ON gestori.codice = tariffa.gestore)
LEFT JOIN contratto ON tariffa.gestore=contratto.gestore
AND tariffa.codice=contratto.tariffa
WHERE Contratto.gestore IS NULL
----
così dovrebbe andare (se ho capito il probema)

Ciao Giorgio
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5