Newsgroup: it.comp.lang.visual-basic
Titolo: Domanda con SQL e Access

Salve,
sto imparando l'SQL con Access .
Ho due tabelle : 1) Articoli e 2) Fornitori .
Articoli ha diversi campi, ad esempio:
- ID_articolo
- descrizione
- etc...
- ID_fornitore
Fornitori ha:
- ID_fornitore
- nome
Ora, quando faccio visualizzare gli articoli in una LISTBOX , ovviamente
voglio ottenere il 'nome' del fornitore attraverso l' 'ID_fornitore'
contenuto in 'Articoli'.
E faccio così:
SELECT TBL_articoli.ID_articolo, TBL_articoli.descrizione,
TBL_fornitori.nome FROM TBL_articoli, TBL_fornitori WHERE
TBL_articoli.ID_fornitore = TBL_fornitori.ID_fornitore ;
E funziona...
Ma ho un problema: se non passo un ID_fornitore quando faccio la 'INSERT'
nella tabella articoli (perché magari l'utente non ha ancora inserito un
fornitore) , la query sopra non mi restituisce l'articolo.
In pratica non mi restituisce l'articolo che non abbia l'ID_fornitore
presenta anche nella tabella Fornitori.
Io vorrei che se il fornitore non è stato settato, l'articolo comparisse
comunque nella lista.
[...]
Spero di essermi spiegato... grazie mille !
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 comunque nella lista.
Ti consiglio di studiarti almeno le basi dell'SQL, se ho capito bene il
problema:
SELECT TBL_articoli.ID_articolo, TBL_articoli.descrizione,
TBL_fornitori.nome 
FROM TBL_articoli INNER JOIN TBL_fornitori 
ON TBL_articoli.ID_fornitore = TBL_fornitori.ID_fornitore ;
Questa sostituisce la tua where, e di solito è più veloce (o di sicuro
non più lenta). Per fare quello che vuoi ti basta una LEFT JOIN al posto
della INNER JOIN.
-- 
Freccia@Bulldozer63 :D

 fornitore) , la query sopra non mi restituisce l'articolo.
gli hai chiesto di darti gli articoli WHERE...
se l'id_fornitore non c'è...
ciao, a. 

Enrico scriveva il 27/11/2008 :

Quello che tu hai fatto è un prodotto cartesiano fra tabelle, su cui 
poi effettui un filtro in Where per arrivare ad un Inner Join. Anche se 
ci arrivi in maniera tutt'altro che ottimizzata, visto che non 
comunicando all'ottimizzatore che vuoi un inner join, questo fa 
veramente il prodotto cartesiano.
La tua query andrebbe quindi riscritta come:
SELECT
TBL_articoli.ID_articolo
, TBL_articoli.descrizione
,TBL_fornitori.nome
 FROM TBL_articoli
INNER JOIN TBL_fornitori
ON TBL_articoli.ID_fornitore = TBL_fornitori.ID_fornitore
Poi, per risolvere lo specifico problema, basta utilizzare il Left 
Outer Join al posto dell'Inner Join:
SELECT
TBL_articoli.ID_articolo
, TBL_articoli.descrizione
,TBL_fornitori.nome
 FROM TBL_articoli
LEFT OUTER JOIN TBL_fornitori
ON TBL_articoli.ID_fornitore = TBL_fornitori.ID_fornitore
A questo punto però in 'nome' troveresti NULL, mentre magari tu vuoi 
una cosa tipo '---':
SELECT
TBL_articoli.ID_articolo
, TBL_articoli.descrizione
,COALESCE(TBL_fornitori.nome,'---') AS nome
 FROM TBL_articoli
LEFT OUTER JOIN TBL_fornitori
ON TBL_articoli.ID_fornitore = TBL_fornitori.ID_fornitore
Non ricordo poi se la sintassi SQL di Access accetta il Coalesce, 
eventualmente sostituisci con IsNull.
Alberto
-- 
Fabio Fazio: Se siamo alleati come mai nei nostri bar si vende Coca 
Cola e nei bar americani non si vende l'amaretto di Saronno?

 ON TBL_articoli.ID_fornitore = TBL_fornitori.ID_fornitore
Una cosa... se avessi anche un altro campo da inserire... oltre
all'ID_fornitore, ad esempio
l' ID_categoria ???
Posso fare cosě :
SELECT
TBL_articoli.ID_articolo,
TBL_articoli.descrizione,
TBL_fornitori.nome,
TBL_categoria,nome
FROM TBL_articoli
LEFT OUTER JOIN TBL_fornitori ,
LEFT OUTER JOIN TBL_categorie
ON TBL_articoli.ID_fornitore = TBL_fornitori.ID_fornitore
AND TBL_articoli.ID_categoria = TBL_categorie.ID_categoria;
Grazie ancora !


Scusate, c'era un errore di battitura, ecco :
SELECT
TBL_articoli.ID_articolo ,
TBL_articoli.descrizione ,
TBL_fornitori.nome ,
TBL_categoria.nome
FROM TBL_articoli
LEFT OUTER JOIN TBL_fornitori ,
LEFT OUTER JOIN TBL_categorie
ON TBL_articoli.ID_fornitore = TBL_fornitori.ID_fornitore
AND TBL_articoli.ID_categoria = TBL_categorie.ID_categoria ;


 AND TBL_articoli.ID_categoria = TBL_categorie.ID_categoria;
No, ogni join vuole il suo ON:
SELECT
TBL_articoli.ID_articolo,
TBL_articoli.descrizione,
TBL_fornitori.nome,
TBL_categoria.nome
FROM TBL_articoli
LEFT OUTER JOIN TBL_fornitori
ON TBL_articoli.ID_fornitore = TBL_fornitori.ID_fornitore
LEFT OUTER JOIN TBL_categorie
ON TBL_articoli.ID_categoria = TBL_categorie.ID_categoria
Alberto
-- 
Karl Marx: Le circostanze fanno l'uomo non meno di quanto l'uomo faccia 
le circostanze.