Newsgroup: it.comp.appl.access
Titolo: unione di più query con duplice criterio

Buonasera.
In una query unione di due query con doppio criterio, ho bisogno di unire una terza query.
Prima avevo:
SELECT presenze.varicampi
FROM presenze LEFT JOIN assenze2 ON (presenze.idarticolo = assenze2.idarticolo) AND (presenze.ultimodiid = 
assenze2.id
)
 
UNION SELECT assenze.varicampi
FROM assenze2 LEFT JOIN presenze ON (assenze2.idarticolo = presenze.idarticolo) AND (
assenze2.id
 = presenze.ultimodiid);
 
ora ho:
SELECT presenze.varicampi
FROM presenze LEFT JOIN assenze2 ON (presenze.idarticolo = assenze2.idarticolo) AND (presenze.ultimodiid = 
assenze2.id
) LEFT JOIN ContrUtenti ON (presenze.idarticolo = ContrUtenti.idarticolo) AND (presenze.ultimodiid = ContrUtenti.ultimodiid)  
 
UNION SELECT Assenze2.varicampi
FROM assenze2 LEFT JOIN presenze ON (assenze2.idarticolo = presenze.idarticolo) AND (
assenze2.id
 = presenze.ultimodiid) LEFT JOIN ContrUtenti ON (assenze2.idarticolo = ContrUtenti.idarticolo) AND (
assenze2.id
 = ContrUtenti.ultimodiid)
 
UNION SELECT ContrUtenti.varicampi
FROM ContrUtenti LEFT JOIN presenze ON (ContrUtenti.idarticolo = presenze.idarticolo) AND (ContrUtenti.ultimodiid = presenze.ultimodiid) LEFT JOIN assenze2 ON (ContrUtenti.idarticolo = assenze2.idarticolo) AND (ContrUtenti.ultimodiid = 
assenze2.id
);
 
su esecuzione della query mi dà errore di sintassi (operatore mancante) già sul primo FROM.
 
Grazie in anticipo.
Giuseppe.
 
 

 su esecuzione della query mi dà errore di sintassi (operatore mancante) già sul primo FROM.
 
Mancano dei parentesi (per ACE). Prova così:
 
SELECT presenze.varicampi
FROM ( presenze LEFT JOIN assenze2 ON (presenze.idarticolo = 
assenze2.idarticolo) AND (presenze.ultimodiid = 
assenze2.id
) )
LEFT JOIN ContrUtenti ON (presenze.idarticolo = ContrUtenti.idarticolo) 
AND (presenze.ultimodiid = ContrUtenti.ultimodiid)
 
e così via per le altre parti.
 
-- 
Ciao
Karl
*********
Access FAQ:  
http://www.donkarl.com/it
 
Access Lobby: 
http://www.AccessDevelopers.org
 


Grazie Karl funziona ma....... cc'è un'altro problema.
Allora posto l'intero SQL perchè adesso le righe FROM ...... funzionano, ma mi dà errore solo sull'ultimo campo che esiste solo nella terza query contrUtenti.Contributo. Se lo tolgo dalle tre SELECT funziona.
 
SELECT presenze.ultimodiid AS id, presenze.codcliente, presenze.descrsuppl, presenze.ultimodinfattura AS nfattura, presenze.ultimodidatafattura AS Datafattura, presenze.idazienda, presenze.idcategoria, presenze.idstruttura, presenze.idarticolo, presenze.iddsm, presenze.idcsm, presenze.idddp, presenze.idsert, presenze.periodo, presenze.anno,  presenze.mese,presenze.mese2,  presenze.sommadiqta AS quantita, Ccur(presenze.prezzo) AS Costo,  Ccur(presenze.importo) AS ImportoTotale, nz(assenze2.qta2,0) AS qta2, presenze.idiva, Ccur(nz(assenze2.prezzo,0)) AS prezzo2, CCur(nz(assenze2.importo,0)) AS ImportoTotale2, nz(ContrUtenti.contributo,0)
FROM (presenze LEFT JOIN assenze2 ON (presenze.idarticolo = assenze2.idarticolo) AND (presenze.ultimodiid = 
assenze2.id
)) LEFT JOIN ContrUtenti ON (presenze.idarticolo = ContrUtenti.rifidarticolo) AND (presenze.ultimodiid = ContrUtenti.ultimodiid)
 
UNION SELECT 
assenze2.id
, assenze2.codcliente, assenze2.descrsuppl,  assenze2.nfattura, assenze2.datafattura, assenze2.idazienda, assenze2.idcategoria, assenze2.idstruttura, assenze2.idarticolo, assenze2.iddsm, assenze2.idcsm, assenze2.idddp, assenze2.idsert, assenze2.periodo, assenze2.anno, assenze2.mese, assenze2.mese2, nz(presenze.sommadiqta,0) AS quantita, Ccur( nz(presenze.prezzo,0)) AS Costo, Ccur(nz(presenze.importo,0)) AS ImportoTotale, assenze2.qta2 AS Qta2, assenze2.idiva, Ccur(assenze2.prezzo) AS prezzo2, Ccur(assenze2.importo) AS ImportoTotale2, nz(ContrUtenti.contributo,0)
FROM (assenze2 LEFT JOIN presenze ON (assenze2.idarticolo = presenze.idarticolo) AND (
assenze2.id
 = presenze.ultimodiid)) LEFT JOIN ContrUtenti ON (assenze2.idarticolo = ContrUtenti.rifidarticolo) AND (
assenze2.id
 = ContrUtenti.ultimodiid)
 
UNION SELECT ContrUtenti.ultimodiid AS id, ContrUtenti.codcliente, ContrUtenti.descrsuppl,  ContrUtenti.ultimodinfattura AS nfattura, ContrUtenti.ultimodidatafattura AS DataFattura, ContrUtenti.idazienda, ContrUtenti.idcategoria, ContrUtenti.idstruttura, ContrUtenti.rifidarticolo AS idarticolo, ContrUtenti.iddsm, ContrUtenti.idcsm, ContrUtenti.idddp, ContrUtenti.idsert, ContrUtenti.periodo, ContrUtenti.anno, ContrUtenti.mese, ContrUtenti.mese2, nz(presenze.sommadiqta,0) AS quantita, Ccur( nz(presenze.prezzo,0)) AS Costo, Ccur(nz(presenze.importo,0)) AS ImportoTotale, nz(assenze2.qta2,0) AS Qta2, ContrUtenti.idiva, Ccur(nz(assenze2.prezzo,0)) AS prezzo2, CCur(nz(assenze2.importo,0)) AS ImportoTotale2, nz(ContrUtenti.contributo,0)
FROM (ContrUtenti LEFT JOIN presenze ON (ContrUtenti.rifidarticolo = presenze.idarticolo) AND (ContrUtenti.ultimodiid = presenze.ultimodiid)) LEFT  JOIN assenze2 ON (ContrUtenti.rifidarticolo = assenze2.idarticolo) AND (ContrUtenti.ultimodiid = 
assenze2.id
);
 
l'errore è: L'espressione è stata digitata in modo non corretto o è troppo complessa per essere valutata. Un'espressione numerica, ad esempio, può contenere troppi elementi complessi. Semplificare assegnando parti dell'espressione a variabili.
 
Nella query ContrUtenti ha il segno negativo. L'ho fatto diventare positivo, nel casso fosse questo il problema, ma niente. Il nome della query e del campo sono corretti.
Ho provato anche ad unire solo la query presenze e quella ContrUtenti e ho lo stesso risultato della query unione con le tre query. 
Che probliemi ha quel maledetto campo?
Grazie.

Io applico il "dividi et impera".
Cioè: essendo la UNION la "somma" di n risultati di set di dati, ogni set deve necessariamente restituire gli stessi risultati (intesi come tipo e numero di campi). 
Pertanto, quando devi lavorare su una UNION il consiglio è spezzare l'intero testo dell'SQL nelle due (o tre...etc) singole query e verificare che funzionino e diano i risultati attesi. 
Solo dopo questa verifica puoi unirle con UNION ed essere certo che funzioni. 
ATTENZIONE: i risultati delle singole query, oltre a necessitare degli stessi campi come tipo e quantità, li devono avere anche nelle stesse posizioni.
Ciao!

 lo tolgo dalle  tre SELECT funziona.
 
Ti sei risposto da solo: tutti i campi devono esistere in tutte le query. Se un campo non esiste 
lo inventi e lo valorizzi adeguatamente. Questo in generale.
Nello specifico, penso ti riferisca al campo nz, a me pare che esista in tutte le query
 
-- 
Greg
 
 


Grazie per le risposte.
Ho creato il campo contributo anche nelle query assenze2 e presenze. 
Se nella query unione inserisco nelle due righe Select presenze e Select assenze2 il campo riferito alla propria query, non mi raggruppa i record perchè il valore del campo contributo è 0 mentre in quello della query ContrUtenti è diverso da 0. Se invece, anche nelle righe select di presenze e assenze2, inserisco sempre il campo ContrUtenti.contributo allora mi esce il messaggio di errore.
In pratica su 4 fatture, 3 hanno il contributo che ha un codice articolo differente (per questo ho creato un campo "RifIdArticolo" in cui riporto l'IdArticolo a cui si riferisce). Per cui nel primo campo la query unione non si blocca ma mi dà 7 record, nel secondo mi dà errore.
Spero di essere stato chiaro.
Giuseppe