Il wiki della programmazione - Tipi di JOIN

Home :: Pagine che puntano a questa :: Login/Register

Chiudi

Ancora dubbi? Suggerimenti?





Tipi di JOIN

Capita di vedere nelle query generate automaticamente o scritte da altri cose come INNER JOIN, LEFT JOIN, FULL JOIN. Ma cosa significano queste diciture?

INNER JOIN

INNER JOIN è una clausola che fa corrispondere ad un elemento di una tabella un elemento uguale in un'altra tabella. Per esempio, se esistono una tabella di regioni e una di province, è possibile associare un identificativo di regione all'identificativo della provincia:
Regioni
ID Regione Regione
1 Veneto
2 Campania
3 Abruzzo

Province
ID ID_Regione Provincia
1 1 Venezia
2 1 Belluno
3 2 Napoli
4 2 Salerno
5 3 Pescara


Eseguendo questa query:
SELECT regione, provincia
FROM regioni INNER JOIN province ON
  regioni.ID = province.ID_regione

Quello che si ottiene sarà un recordset con questo contenuto:
Recordset risultato della query
Regione Provincia
Veneto Venezia
Veneto Belluno
Campania Napoli
Campania Salerno
Abruzzo Pescara

LEFT e RIGHT JOIN

In questo caso la corrispondenza tra regioni e province è perfetta, ma potrebbe non essere sempre così. Per esempio, usando INNER JOIN tra una tabella di persone e una di patenti, è possibile che ci siano persone che non hanno la patente.
Persone
ID Nome Cognome
1 Guido Vespa
2 Placido Mansueto

Patenti
ID_persona Patente Rilasciata da
1 VE1234567890 Pref. Venezia

Facendo un INNER JOIN in questo caso si vedrebbero solo le persone che hanno la patente, ignorando quelle che non ce l'hanno, in quanto non hanno corrispondenze nell'altra tabella:
SELECT nome, cognome, patente
FROM persone INNER JOIN patenti ON
  persone.ID = patenti.ID_persona 

Recordset risultato della query
nome cognome patente
Guido Vespa VE1234567890

Come si vede, non c'è traccia di Placido Mansueto

Per ottenere comunque tutti gli elementi della tabella di persone occorre usare il LEFT JOIN, che include tutti gli elementi della tabella di persone e le associa alle patenti che esistono; per gli altri, inserisce valori nulli:
SELECT nome, cognome, patente
FROM persone LEFT JOIN patenti ON
  persone.ID = patenti.ID_persona 

Recordset risultato della query
nome cognome patente
Guido Vespa VE1234567890
Placido Mansueto  

In alternativa si sarebbe potuto costruire il join in maniera opposta, utilizzando il RIGHT JOIN:
SELECT nome, cognome, patente
FROM patenti RIGHT JOIN persone ON
  patenti.ID_persona = persone.ID

La clausola RIGHT JOIN non è supportata da tutti i database.

FULL JOIN

Il join di tipo FULL unisce tutte le righe di entrambe le tabelle, lasciando nulli i valori che non trovano una corrispondenza. Per esempio se ci sono degli invitati e dei tavoli, e si vogliono associare tra loro, si possono vedere tutti gli invitati e i tavoli, anche se ancora non sono associati tra loro:
ID Nome
1 Franca Polpetta
2 Fausto Verdi
3 Giulio Facchini

ID COD_tavolo ID_persona
1 FIN1 1
2 FIN1 2
3 BAN1  
4 BAN2  

Eseguendo la query:
SELECT nome, COD_tavolo, Tavoli.ID
FROM persone FULL JOIN tavoli ON
  persone.ID = tavoli.ID_persona

si ottiene questo recordset:
Recordset risultato della query
nome COD_tavolo Tavoli.ID
Franca Polpetta FIN1 1
Fausto Verdi FIN1 2
Giulio Facchini    
  BAN1 3
  BAN2 4

La clausola FULL JOIN non è supportata da tutti i database.

CROSS JOIN

Il CROSS JOIN è il tipo di join più semplice, sia come sintassi sia per la tipologia di calcolo. Il principio è semplice: ad ogni elemento di una tabella si fa corrispondere ciascun elemento dell'altra tabella. In questo modo il numero di righe è dato dal prodotto delle due tabelle (cioè tutte le combinazioni possibili).

Per esempio, avendo una tabella di maschi e una di femmine
Tabella Maschi
Nome
Marco
Gino
Franco

Tabella Femmine
Nome
Marta
Giulia
Francesca

e volendo sapere tutte le coppie possibili, si possono unire con un CROSS JOIN:
SELECT maschi.nome, femmine.nome
FROM maschi, femmine 

Recordset risultato della query
Maschi.Nome Femmine.Nome
Marco Marta
Gino Marta
Franco Marta
Marco Giulia
Gino Giulia
Franco Giulia
Marco Francesca
Gino Francesca
Franco Francesca

INNER e OUTER

La differenza tra INNER JOIN e OUTER JOIN è che INNER mostra solo i record che hanno una corrispondenza in entrambe le tabelle, come già visto, mentre gli OUTER (a cui appartengono LEFT, RIGHT e FULL) accettano anche righe in cui non ci sia una corrispondenza perfetta tra le tabelle.
CROSS JOIN non è né INNER né OUTER, in quanto "forza" entrambe le tabelle ad avere sempre una corrispondenza perfetta

La clausola NATURAL

Nel caso in cui siano usati gli stessi nomi per campi che rappresentano lo stesso dato in tabelle diverse, per farne un join basta specificare la clausola NATURAL; in questo modo automaticamente i campi con lo stesso nome saranno legati tra loro. La clausola è utilizzabile sia con gli INNER sia con gli OUTER JOIN.
La clausola NATURAL JOIN non è supportata da tutti i database.
Categories
Database

Non ci sono commenti. [Aggiungere un commento]

Valid XHTML 1.0 Strict :: Valid CSS :: Realizzato con Wikka Wakka Wiki 1.1.6.3
Page was generated in 0.0545 seconds