Attraverso l'istruzione join, siamo in grado di mettere in relazione tra di loro le righe di "due" o più tabelle, abbinando le righe in base ai valori delle colonne disponibili in entrambe le tabelle.
Per comodità divideremo le join in tre gruppi, "inner join", "outer join" e "cross join", ognuno dei quali, ovviamente, consente di ottenere risultati differenti.
Per comprenderne meglio l'utilizzo e le differenze facciamo qualche esempio pratico, iniziandocol costruire due tabelle, Autori e Opere.
SET NOCOUNT ON
USE tempdb
--Creo la tabella autori
CREATE TABLE Autori
(
idAutore INT,
Autore varchar(25)
)
--Creo la tabella opere
CREATE TABLE Opere
(
idOpera int,
idAutore int,
Titolo varchar(50)
)
--Inserisco dei valori nelle due tabelle
insert into Autori values(1, 'Francesco Balena')
insert into Autori values(2, 'E.A. Poe')
insert into Autori values(3, 'Mario Del Ghetto')
insert into Autori values(4, 'Sandro Bizioli')
insert into Opere values(1, 1, 'Programming Visual Baisc 2005')
insert into Opere values(2, 1, 'Programmare Microsoft Visual Baisc 6')
insert into Opere values(3, 1, 'Visual Basic .Net nozioni di base')
insert into Opere values(4, 2, 'I racconti del mistero')
insert into Opere values(5, 2, 'Eureka')
insert into Opere values(6, 3, 'Visual Basic 2005')
insert into Opere values(7, 99, 'Libro senza autore')
Inner JoinRappresentano la più comune forma di join, utilizzando operatori di confronto (= o <>).
Attraverso la inner join è possibile estrarre solo i valori presenti nella prima tabella e che trovano riscontro nella seconda.
-- Recupero l'elenco degli autori che hanno un riferimento nella tabella opere
SELECT
A.Autore,
O.Titolo
FROM autori A
INNER JOIN Opere O on a.idAutore = o.IdAutore
ORDER BY autore
/* Output
Autore Titolo
------------------------- -------------------------------------
E.A. Poe I racconti del mistero
E.A. Poe Eureka
Francesco Balena Programming Visual Baisc 2005
Francesco Balena Programmare Microsoft Visual Baisc 6
Francesco Balena Visual Basic .Net nozioni di base
Mario Del Ghetto Visual Basic 2005
*/
Come si può notare Sandro Bizioli non compare, dato che non vi sono opere a lui associate.
Neppure il libro "Libro senza autore" è visibile dato che non vi è relazione con nessun autore.
Le Outer Join (left, right, full)Permettono di recuperare
l'intero set di valori di una delle tabelle poste in relazione, recuperando anche quei valori che non hanno una diretta relazione e sostituendo i valori non riscontrati con dei Null.
Left join: permette di relazionare due tabelle tra di loro recuperando l'intero set di valori della tabella posta a sinistra nella relazione. Qualora non esistano valori corrispondenti nella tabella
relazionata, essi verranno sostituiti con dei NULL.
Questa join mi restituirà tutti gli elementi della tabella autori, le loro rispettive opere e, qualora non ve ne fossero, riporterà NULL come valore nella colonna titolo.
SELECT
A.Autore,
O.Titolo
FROM autori A
LEFT JOIN Opere O on a.idAutore = o.IdAutore
ORDER BY autore
/* Output
Autore Titolo
------------------------- --------------------------------------------------
E.A. Poe I racconti del mistero
E.A. Poe Eureka
Francesco Balena Programming Visual Baisc 2005
Francesco Balena Programmare Microsoft Visual Baisc 6
Francesco Balena Visual Basic .Net nozioni di base
Mario Del Ghetto Visual Basic 2005
Sandro Bizioli NULL
*/
Come si può notare la left join mi restituirà tutti gli elementi della tabella Autori, i relativi elementi nella tabella Opere e NULL là dove non vi sia una precisa relazione. Infatti, Sandro Bizioli, non ha nessuna opera e quindi nella colonna titolo sarà riportato NULL.
Right join: si comporta esattamente come left join ma la tabella di confronto è posta a destra della relazione.
SELECT
A.Autore,
O.Titolo
FROM autori A
RIGHT JOIN Opere O on a.idAutore = o.IdAutore
ORDER BY Autore
/* Output
Autore Titolo
------------------------- -------------------------------------
NULL Libro senza autore
E.A. Poe I racconti del mistero
E.A. Poe Eureka
Francesco Balena Programming Visual Baisc 2005
Francesco Balena Programmare Microsoft Visual Baisc 6
Francesco Balena Visual Basic .Net nozioni di base
Mario Del Ghetto Visual Basic 2005
*/
In questo caso Sandro Bizioli non compare, poichè la right join impone la selezione di tutti gli elementi della tabella a destra della relazione (Opere per l'appunto). Infatti comparirà il "
Libro senza autore" con la colonna Autore = NULL dato che lo stesso non è presente.
Full join: Vengono relazionate tra di loro entrambe le tabelle sia a destra che a sinistra e i valori non presenti vengono sotituiti con dei NULL.
SELECT
A.Autore,
O.Titolo
FROM autori A
FULL JOIN Opere O on a.idAutore = o.IdAutore
ORDER BY Autore
/*Output
Autore Titolo
------------------------- -------------------------------------
NULL Libro senza autore
E.A. Poe I racconti del mistero
E.A. Poe Eureka
Francesco Balena Programming Visual Baisc 2005
Francesco Balena Programmare Microsoft Visual Baisc 6
Francesco Balena Visual Basic .Net nozioni di base
Mario Del Ghetto Visual Basic 2005
Sandro Bizioli NULL
*/
Attraverso la full join abbiamo ottenuto un risultato pari ad una right e left join contemporanee.
Infatti ora abbiamo tutti gli autori e tutti i titoli, trovando NULL in una delle due colonne là dove non esiste relazione.
Cross joinRestituiscono tutte le righe della tabella di sinistra, ciascuna delle quali viene combinata con tutte le righe della tabella di destra.
SELECT
Autore,
Titolo
FROM autori A
CROSS JOIN Opere
ORDER BY Autore
/*Output
Autore Titolo
------------------------- --------------------------------------
E.A. Poe Programming Visual Baisc 2005
E.A. Poe Programmare Microsoft Visual Baisc 6
E.A. Poe Visual Basic .Net nozioni di base
E.A. Poe I racconti del mistero
E.A. Poe Eureka
E.A. Poe Visual Basic 2005
E.A. Poe Libro senza autore
Francesco Balena Programming Visual Baisc 2005
Francesco Balena Programmare Microsoft Visual Baisc 6
Francesco Balena Visual Basic .Net nozioni di base
Francesco Balena I racconti del mistero
Francesco Balena Eureka
Francesco Balena Visual Basic 2005
Francesco Balena Libro senza autore
Mario Del Ghetto Programming Visual Baisc 2005
Mario Del Ghetto Programmare Microsoft Visual Baisc 6
Mario Del Ghetto Visual Basic .Net nozioni di base
Mario Del Ghetto I racconti del mistero
Mario Del Ghetto Eureka
Mario Del Ghetto Visual Basic 2005
Mario Del Ghetto Libro senza autore
Sandro Bizioli Programming Visual Baisc 2005
Sandro Bizioli Programmare Microsoft Visual Baisc 6
Sandro Bizioli Visual Basic .Net nozioni di base
Sandro Bizioli I racconti del mistero
Sandro Bizioli Eureka
Sandro Bizioli Visual Basic 2005
Sandro Bizioli Libro senza autore
*/
Alla fine eliminiamo le tabelle
-- Elimino le tabelle
DROP TABLE Autori
DROP TABLE Opere
Maggiori informazioni sono reperibili sui Books on Line di SQL Server 2000 e 2005