giovedì 11 novembre 2010

SQL: JOIN con Micosoft Access

Oggi mi sono "impelagato" per fare una query semplice che però non faccio spesso, e quindi sbaglio ogni volta che mi serve.

Ho una tabella con un elenco di prodotti chiamata t_prodotti(id, nome, descrizione) appunto e una tabella con dei files associati ai vari prodotti, la t_files_prodotto(id, id_prodotto, path, descrizione, tipo).

Le tabelle sono così strutturate

t_prodotti
-------------------------------------------------
1 "Cappello fiorato" "Cappello ecc. ecc."
2 "Cappello lana" "Cappello ecc. ecc."
3 "Cappello cotone" "Cappello ecc."
-------------------------------------------------

t_files_prodotto
---------------------------------------------------------------------
1 1 http://www.miosito.it/img/1.jpg "Vista frontale" jpg
2 1 http://www.miosito.it/img/2.jpg "Vista laterale" jpg
3 1 http://www.miosito.it/docs/1.pdf "Manuale" pdf
4 2 http://www.miosito.it/img/3.jpg "Vista laterale" jpg
5 3 http://www.miosito.it/img/2.pdf "Brochure" pdf
---------------------------------------------------------------------

Voglio visualizzare tutti i prodotti con la loro immagine, quindi scrivo:

SELECT nome, descrizione, path FROM t_prodotti INNER JOIN t_files_prodotto ON t_prodotti.id=T_files_prodotto.id_prodotto

Ecco il risultato:
-------------------------------------------------------------------------
"Cappello fiorato" "Cappello ecc." http://www.miosito.it/img/1.jpg
"Cappello fiorato" "Cappello ecc." http://www.miosito.it/img/2.jpg
"Cappello fiorato" "Cappello ecc." http://www.miosito.it/img/1.pdf
"Cappello lana" "Cappello ecc." http://www.miosito.it/img/3.jpg
"Cappello cotone" "Cappello ecc." http://www.miosito.it/img/2.pdf
-------------------------------------------------------------------------

Non è certo quello di cui ho bisogno! Così ho visualizzato anche dei prodotti con dei files PDF e non solo le fotografie. Modifico la mia query

SELECT nome, descrizione, path FROM t_prodotti INNER JOIN t_files_prodotto ON t_prodotti.id=t_files_prodotto.id_prodotto WHERE t_files_prodotto.tipo="jpg"

Ecco il risultato della query modificata:
-------------------------------------------------------------------------
"Cappello fiorato" "Cappello ecc." http://www.miosito.it/img/1.jpg
"Cappello fiorato" "Cappello ecc." http://www.miosito.it/img/2.jpg
"Cappello lana" "Cappello ecc." http://www.miosito.it/img/3.jpg
-------------------------------------------------------------------------

Ora ho eliminato i PDF ma con loro ho perso il prodotto 4 che non aveva foto ma che comunque voglio nell'elenco! Quindi seconda modifica della query

SELECT nome, descrizione, path FROM t_prodotti LEFT OUTER JOIN t_files_prodotto ON t_prodotti.id=t_files_prodotto.id_prodotto WHERE t_files_prodotto.tipo="jpg"

Ecco il risultato della query modificata la seconda volta:
-------------------------------------------------------------------------
"Cappello fiorato" "Cappello ecc." http://www.miosito.it/img/1.jpg
"Cappello fiorato" "Cappello ecc." http://www.miosito.it/img/2.jpg
"Cappello lana" "Cappello ecc." http://www.miosito.it/img/3.jpg
"Cappello cotone" "Cappello ecc." null
-------------------------------------------------------------------------

Ho solo il doppione da elminiare sulla tabella prodotti, quindi terza modifica:
SELECT nome, descrizione, path FROM t_prodotti LEFT OUTER JOIN (SELECT TOP 1 * FROM t_files_prodotto ON t_prodotti.id=t_files_prodotto.id_prodotto) as t_files WHERE t_files.tipo="jpg"

Ecco il risultato della query modificata la seconda volta:
-------------------------------------------------------------------------
"Cappello fiorato" "Cappello ecc." http://www.miosito.it/img/1.jpg
"Cappello lana" "Cappello ecc." http://www.miosito.it/img/3.jpg
"Cappello cotone" "Cappello ecc." null
-------------------------------------------------------------------------

Ecco il mio elenco filtrato, ho finalmente risolto, ci sono tutti i prodotti con 1 foto, ad eccetto del prodotto che non ha nessuna foto associata.

Posso dormire tranquillo

G

Nessun commento:

Posta un commento