Sandro Bizioli


Chi sogna di giorno conosce molte cose che sfuggono a chi sogna soltanto di notte. (E.A.Poe)
Mappa

Join in SQL Server

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 Join
Rappresentano 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 join
Restituiscono 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
Categoria: SQL Server
martedì, 16 mag 2006 Ore. 09.29
Statistiche
  • Views Home Page: 111.555
  • Views Posts: 568.320
  • Views Gallerie: 117.624
  • n° Posts: 227
  • n° Commenti: 222
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003