Newsgroup: it.comp.lang.visual-basic
Titolo: alternativa a MINUS

Dopo aver felicemente scoperto l'utilizzo della clausola UNION
accettata da VB su Access, credo di essere arrivato alla desolante
conclusione che invece non è supportata la MINUS.
Senza voler tentare di capire il perché di questa discriminazione,
accetto consigli su come costruire la query per un recordset
incrementalmente, per cioè aggiungere record in base a scelte
dell'utente con la UNION ed eliminarne altri con la MINUS (se solo si
potesse ...)
Spero di essere stato chiaro. Grazie in anticipo.

lopi ha scritto:

Non è VB che accetta o meno UNION nè tanto meno Access, ma JET
DBEngine di Access.
Se non sbaglio MINUS deriva da Oracle..., nè SQL_Server nè JET lo
supportano.
Credo tu debba ristrutturare le tue queries con le clausole
"WHERE NOT IN.... " 
oppure 
"WHERE NOT EXISTS ...."
@Alex

lopi ci ha detto :

Innanzitutto, VB non c'entra una fava.
In Access tu passi la query al provider (immagino Jet), e questo fa da 
motore dati. Quindi, al limite sarà Jet a accettare la Union. Che poi 
non so neanche se faccia una vera Union o una Union All, ma non 
importa.
La Minus è una clausola strana, forse neppure Ansi, comunque 
discretamente replicabile con un Left Outer join Where is null e un 
gioco di Coalesce, oppure col where not exists (che però rischia di 
diventare pesante come performance).
Ciao
Alberto
-- 
Charles Baudelaire: C'è un solo modo di dimenticare il tempo: 
impiegarlo.

 replicabile con un Left Outer join Where is null e un gioco di Coalesce, 
Emh, sorry gays, intendevo Full Outer, non Left Outer...
Ciao
Alberto
-- 
La bellezza è opinabile, sulla bruttezza sono tutti d'accordo.

 Emh, sorry gays
Ehm... a chi ti riferisci?
Io sono per un "parla come scrivi" ma in alcune occasioni è meglio evitare 
:)
Ciao 

benissimo, grazie a tutti, ho imparato molte cose
per concludere, vorrei sapere se la soluzione che ho trovato al mio
problema
SELECT campo(1), ... , campo(n-1), campo(n) From Tabella
Where ...  And
[id] Not In (SELECT id From Tabella WHERE ... AND campo(n-1)=x1 AND
campo(n)=y1) And
[id] Not In (SELECT id From Tabella WHERE ... AND campo(n-1)=x2 AND
campo(n)=y2) And
...
[id] Not In (SELECT id From Tabella WHERE ... AND campo(n-1)=xm AND
campo(n)=ym)
è performante, elegante, ecc. (considerato che sul campo [id] c'è un
indice)
ciao. lopi

lopi ha scritto:

Non sono sicuro di aver capito ma non poteva andare una cosa simile...?
SELECT campo(1), ... , campo(n-1), campo(n)
FROM Tabella
WHERE ...  AND
[id] Not In (X1,X2,X3,X....)
@Alex


no, i record da scartare nella query sono quelli che soddisfano la
coppia di criteri campo(n-1)=x(i), campo(n)=y(j)
la formula che ho costruito mi dà il risultato cercato, ma non sono
certo che le performance siano adeguate
ciao. lopi

 ha scritto nel messaggio
news:1168889179.0...@m58g2000cwm.googlegroups.com...
Alessandro Baraldi ha scritto:

ciao. lopi
Beh che vuol dire....?
SELECT campo(1), ... , campo(n-1), campo(n)
FROM Tabella
WHERE ...  AND
([campo(n-1)] Not In (X1,X2,X3,X....)
AND [campo(n)] NOT IN(.......))
La forma che hai scritto non è di certo ottimizzata, perchè costringe il
piano d'esecuzione
a ripeterla almeno 2 volte per ogni condizione....!!!
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.alessandrobaraldi.it
---------------------------------------------------------------------------