Query con Join

IL JOIN

Questa volta affrontiamo un argomento un pochino ostico, soprattutto quando ad entrare in scena ci sono dei join ( collegamenti ) nidificati. I collegamenti tra tabelle servono per la cosidetta razionalizzazione dei database, in parole povere lo scopo principale è avere il minor numero di dati duplicati, perchè andrebbe a discapito della grandezza dell’archivio dati e quindi della complessità e della velocità di elaborazione dei dati. Facciamo un esempio pratico:

Tabella Clienti
IDCliente ( intero lungo incr. ), Nome ( testo ), CAP ( testo ), Comune ( testo ), Provincia ( testo )

Può capitare ad esempio che Rossi Mario e Rossi Vittorio siano parenti e siano entrambi dello stesso comune, quindi nell’archivio avrei il primo record con quel comune ed il secondo con lo stesso valore del comune. Possiamo razionalizzare il database semplicemente dividendo la tabella Clienti in 2 tabelle, i clienti per l’appunto e la tabella dei comuni uniti da una relazione come l’identificativo univoco del comune.

Tabella Clienti
IDCliente ( intero lungo incr. ), Nome ( testo ), IDComune ( intero lungo )
Tabella Comuni
IDComune ( intero lungo incr. ), CAP ( testo ), Comune ( testo ), Provincia ( testo )

In questo modo in una query di selezione basta riunire i valori con l’elemento in comune e questo per l’appunto viene fatto attraverso il join. Poniamo di trovare il nome ed il comune di tutti i clienti che hanno il nome che inizia per F:

SELECT [Clienti.Nome], [Comuni.Comune] FROM Clienti INNER JOIN Comuni ON Clienti.IDComune = Comuni.IDComune WHERE Clienti.Nome LIKE ‘f*’

La sintassi per il join è prendere la prima tabella (INNER JOIN ) con la seconda ed unirli tramite l’elemento uguale ( ON x1 = x2 ). In questo caso abbiamo utilizzato un “INNER JOIN” con il quale la prima tabella ha elementi significativi così come la seconda, in pratica sono sullo stesso livello, quindi posso avere tra i risultati soltanto i clienti con almeno un comune. Se desidero avere nella selezione anche i clienti senza un comune devo fare il “LEFT JOIN”, quindi dare più importanza alla tabella di sinistra, che nel nostro caso è la tabella clienti.

SELECT [Clienti.Nome], [Comuni.Comune] FROM Clienti LEFT JOIN Comuni ON Clienti.IDComune = Comuni.IDComune WHERE Clienti.Nome LIKE ‘f*’

In questo caso nella selezione avrei anche i clienti senza comune. Per il caso inverso, il “RIGHT JOIN” e quindi comuni anche senza clienti nella selezione:

SELECT [Clienti.Nome], [Comuni.Comune] FROM Clienti RIGHT JOIN Comuni ON Clienti.IDComune = Comuni.IDComune WHERE Clienti.Nome LIKE ‘f*’

In Access è facile costruire un join ( collegamento ), lo si può creare a livello di query o se le 2 tabelle devono sempre andare insieme lo si può anche creare come elemento dell’intero database; dal menu strumenti selezionare relazioni e creare una nuova relazione. La grafica è molto intuitiva in quanto il left e right join sono rappresentate da delle linee con freccie. Per collegamenti nidificati basta inserire altre tabelle e nella sintassi vanno anche le parentesi tonde per suddividere le varie parti:

SELECT Clienti.Nome, Comuni.Comune, Banche.Banca FROM (Clienti LEFT JOIN Comuni ON Clienti.IDComune = Comuni.IDComune) LEFT JOIN Banche ON Clienti.IDBanca = Banche.IDBanca

La prossima volta parleremo delle funzioni di aggregazione. Per discussioni e per chiarimenti iscrivetevi al nostro forum.

<< Lezione Precedente – Lezione Successiva >>

Di Giampaolo Rossi

Sviluppatore software da oltre 16 anni.