Newsgroup: it.comp.appl.access
Titolo: query LEFT join

ho un elenco di 1669 prodotti: ItemsModel
ho un file di giacenze con il codice del prodotto, una data e la giacenza: 
Items
 
ho un parametro che mi dice che data mi interessa: 
[Forms]![Parameters]![EndDate]
 
devo ottenere dalla query *tutti* i 1669 prodotti con a fianco la data e la 
giacenza, se disponibili, allrimenti zero o null, non importa
 
SELECT ItemsModel.ARTIKELNUMMER, Items.Update, Items.Quantity
 
FROM ItemsModel LEFT JOIN Items ON ItemsModel.ARTIKELNUMMER = 
Items.ItemCode
 
WHERE (((Items.Update)=[Forms]![Parameters]![EndDate] Or (Items.Update) Is 
Null));
 
se nella condizione WHERE metto *solo* il controllo della data 
(Items.Update)=[Forms]![Parameters]![EndDate]
mi ritorna solo i 567 record che esistono in Items con quella data
 
se aggiungo, come scritto sopra, anche la condizione
(Items.Update) Is Null)
me ne recupera 1648
 
i record mancanti?
 
sono quelli che sono presenti in Items ma solo con date diverse da quella 
che mi interessa :(
 
in pratica la query ignora i record presenti ma a quel punto salta anche il 
controllo Is Null
 
come faccio a ottenere tutti i miei 1669 codici?
 
 
soluzione della serva, come ultima possibilità:
eseguo una query che mi aggiunge i record mancanti in Items per la data in 
elaborazione, ma preferirei una soluzione più intelligente
 
-- 
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
-=- -=- -=- -=- -=- -=- -=- -=- - -=-
........... [ al lavoro ] ...........

 
 
table1
ID	Field1
1	a
2	b
3	c
4	d
5	e
 
table2
ID	Field1	Field2
1	a	1
2	a	3
3	a	4
4	a	5
5	b	1
6	b	2
7	b	3
8	c	1
9	c	5
10	d	1
11	d	2
12	d	3
13	d	4
14	d	5
15	e	1
16	e	2
17	e	3
18	e	4
19	e	5
 
query
SELECT Table1.Field1, Table2.Field2
FROM Table1 LEFT JOIN Table2 ON Table1.Field1 = Table2.Field1
WHERE (((Table2.Field2)=3 Or (Table2.Field2) Is Null));
 
se chiedo, come nell'esempio, i codici "3" o null me ne elenca solo 4
 
Field1	Field2
a	3
b	3
d	3
e	3
 
manca c
 
a me serve
 
Field1	Field2
a	3
b	3
c    	0 o Null
d	3
e	3


 
 
La c manca perché se vale 0 non viene considerata, per cui:
 
WHERE Table2.Field2=3 Or Nz(Table2.Field2,0)=0;
 

 
 
grazie per il tentativo mantro, ma pare quasi che tu abbia scritto senza 
provare
 
SELECT Table1.Field1, Table2.Field2
FROM Table1 LEFT JOIN Table2 ON Table1.Field1 = Table2.Field1
WHERE Table2.Field2=3 Or Nz(Table2.Field2,0)=0;
 
il risultato non cambia
 
Field1	Field2
a	3
b	3
d	3
e	3
 


 
 
In effetti non ho provato perché il risultato mi sembrava scontato.
 
Sicuro che Field2 contenga solo valori numerici o nulli?
Prova eventualmente ad intercettare valori stringa:
WHERE Table2.Field2=3 Or Nz(Table2.Field2)=0 Or Len(Nz(Table2.Field2))=0;
 
 

 
 
le due piccole tabelle di esempio le ho messe nel secondo post del thread, 
facendo copia/incolla da access
 
i valori inseriti sono molto semplici, appunto per evitare errori
 
provo comunque anche il secondo suggerimento


 
 
e no, nemmeno questa
 
non vorrei che quello che chiedo sia qualcosa di "assurdo" e non ottenibile 
con le basi dati attuali a meno di integrarle, come ho ipotizzato 
all'inizio, con un po' di record a zero, giusto per avere *sempre* un 
collegamento tra le due tabelle


 
 
Ho provato riproducendo esattamente le tue tabelle con gli stessi dati. 
La query funziona regolarmente visualizzando la 'c' sia che questa abbia 
valore zero o sia null. Dà errore 'dati non corrispondenti' se il valore 
è stringa.
 
Un dubbio: sicuro che lo zero che tu vuoi visualizzare sia veramente 0? 
Non può essere, p.e., 0,00000qualcosa che, a causa dell'arrotondamento, 
tu vedi solo come 0? In questo caso la query, giustamente, non lo espone!
 
 
 

 
 
Ho letto questo post solo dopo che avevo inviato la mia risposta al post 
precedente.
Quello che chiedi non è qualcosa di assurdo. Il collegamento fra le 
tabelle c'è sempre finché il tipo di dati dei campi di collegamento sono 
simili. È ovvio che in table2 il campo field1 deve essere valorizzato 
anche in table1 qualora tu inserissi un valore in field2 di table2.

 
 
p.f. copia la query in SQL e scrivila qui, grazie
 
le tabelle di esempio le ho create a mano, usando la tastiera e non 
copia/incolla da qualche altra parte
 
lo "zero da visualizzare" non è un dato esistente visto che il record in 
table2 non esiste; zero o Null è la stessa cosa per quello che devo fare 
successivamente, l'importante è che ci sia il record 'c'
 
ultima nota: Access è la versione 2010


 
 
SELECT Table1.ID, Table1.Field1, 
DLookUp("[table2]![field2]","table2","[table2]![field1]='" & 
[Table1]![Field1] & "' and [table2]![field2]=3") AS Qty
FROM Table1;
 
quindi, se invece di usare un JOIN utilizzo una DLookUp ottengo quello che 
mi serve:
 
ID	Field1	Qty
1	a	3
2	b	3
3	c	
4	d	3
5	e	3
 
 
con la mia bella riga 'c' con valore Null
 
adesso si tratta di metterla in pista e vedere come aumentano i tempi di 
elaborazione


Il giorno venerdì 14 febbraio 2020 12:55:02 UTC+1, Ammammata ha scritto:
[Cut]
 
Ciao,
il problema sta nel fatto che nella query originale metti una condizione (WHERE (((Items.Update)…) su un campo appartenente alla tabella di destra di una left join. Così facendo tutti i record per cui la tabella di destra non contiene dati che rispondono alla condizione (o non contiene alcun dato) verranno omessi dal risultato.
Dovresti optare per una subquery: direttamente nella Select principale (esattamente come hai fatto con la Dlookup) oppure nella From per prefiltrare la tabella Items.
 
Ciao
Mat.
 
 

 
 
SELECT table1.Field1, table2.Field2
FROM table1 INNER JOIN table2 ON table1.Field1 = table2.Field1
WHERE (((table2.Field2)=3)) OR (((Nz([table2].[Field2]))=0));
 
Questo è l'enunciato SQL che mi permette di visualizzare la 'c' sia a 
valore 0 che nullo. Ho provato sia con Inner Join che con Left Join.
 
Se tolgo la funzione Nz dalla 2.a condizione Where la 'c' non viene 
visualizzata quando è Null e ottengo lo stesso risultato che lamenti tu. 
Se vuoi ottenere la 'c' sia con Null che con zero devi inserire la 
funzione Nz oppure scrivere una terza condizione where.
 
WHERE (((table2.Field2)=3)) OR (([table2].[Field2])=0) OR 
(IsNull(table2.field2));
 
A me funziona. Perché a te no? Ho access 2019, ma le non molte 
applicazioni che ho sviluppato sono quasi tutte con A2010 (il mio 
preferito).
 
La soluzione con DLookUp in una query... beh... non penso sia 
consigliabile per problemi di esecuzione. Non lo dico io, ma i guru di 
questo ng (quando postavano nei bei tempi passati...)
 
 
 
 
 
 
 
 
 
 

 
 
alla fine è quella che ho usato, i tempi si sono allungati un pochino ma 
nemmeno poi tanto, in poco meno di dieci secondi ho il tabellone che mi 
serve
 
sett prox vedo di fare qualche altra prova come suggerisci


 tabella di destra di una left join 
 
ecco, sospettavo che ci fosse una magagna all'origine del ragionamento, 
sett prox vedo se val la pena di migliorare quello che ho fatto (e che 
funziona)
