Outer join ( left outer join, right outer join, full outer join)

14 / 100

Outer join

Una outer join non richiede che ci sia corrispondenza esatta tra le righe di due tabelle. La tabella risultante da una outer join trattiene tutti quei record che non hanno alcuna corrispondenza tra le tabelle. Le outer join si suddividono in left outer joinright outer join, e full outer join, in base a quale sia la tabella di cui intendiamo trattenere i valori in caso di mancata corrispondenza della regola di confronto da (sinistra, destra, o entrambi).

(In questo caso left (sinistra) e right (destra) si riferiscono ai due lati della keyword JOIN.)

NOTA sulle clausole WHERE e ON:

Si sottolinea come esista un ordine di esecuzione tra le condizioni specificate nella WHERE e quelle presenti nella ON.

Specificatamente le clausole presenti nella ON sono valutate ANTERIORMENTE all’esecuzione del join mentre le clausole nella where sono valutate SUCCESSIVAMENTE all’esecuzione del join.

Left outer join

Il risultato di una query left outer join (o semplicemente left join) per le tabelle A e B contiene sempre tutti i record della tabella di sinistra (“left”) A, mentre vengono estratti dalla tabella di destra (“right”) B solamente le righe che trovano corrispondenza nella regola di confronto della join. Questo significa che se la clausola ON trova 0 (zero) righe in B, la join mostrerà una riga risultante con valore NULL in tutte le colonne corrispondenti al risultato per le colonne di B.

Esempio di una left outer join:

SELECT *  
FROM   Impiegati  LEFT OUTER JOIN Dipartimenti  
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
Impiegati.CognomeImpiegati.ID_dipartimentoDipartimenti.Nome_dipartimentoDipartimenti.ID_dipartimento
Bianchi33Tecnico33
Rossi31Vendite31
Santoro34Risorse umane34
Monti34Risorse umane34
GrassiNullNullNull
Mancini33Tecnico33

Right outer join

Una right outer join (o right join) semplicemente ricalca il funzionamento della left outer join, ma invertendo l’ordine delle tabelle interessate.

Il risultato di una query right outer join per le tabelle A e B contiene sempre tutti i record della tabella di destra (“right”) B, mentre vengono estratti dalla tabella di sinistra (“left”) A solamente le righe che trovano corrispondenza nella regola di confronto della join. Questo significa che se la clausola ON trova 0 (zero) righe in A, la join mostrerà una riga risultante con valore NULL in tutte le colonne corrispondenti al risultato per le colonne di A.

Esempio di una right outer join:

SELECT * 
FROM   Impiegati RIGHT OUTER JOIN Dipartimenti 
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
Impiegati.CognomeImpiegati.ID_dipartimentoDipartimenti.Nome_dipartimentoDipartimenti.ID_dipartimento
Monti34Risorse umane34
Bianchi33Tecnico33
Santoro34Risorse umane34
Mancini33Tecnico33
Rossi31Vendite31
NullNullPromozione35

In pratica sono utilizzate maggiormente le query di left outer join rispetto a quelle di right outer join, ma possono verificarsi rari casi in cui in query molto complesse ci sia la necessità di utilizzare contemporaneamente il criterio di left outer join e di right outer join.

Lo stesso risultato della precedente right outer join si può ripetere usando il tipo left outer join:

SELECT * 
FROM   Dipartimenti LEFT OUTER JOIN Impiegati
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento

Full outer join

Una full outer join combina i risultati delle due tabelle A e B tenendo conto di tutte le righe delle tabelle, anche di quelle che non hanno corrispondenza tra di loro.

Il risultato di una query full outer join per le tabelle A e B contiene sempre tutti i record della tabella di sinistra (“left”) A, estraendo dalla tabella di destra (“right”) B solamente le righe che trovano corrispondenza nella regola di confronto della join; inoltre verranno estratti tutti i record della tabella di sinistra (“left”) A che non trovano corrispondenza nella tabella di destra (“right”) B impostando a NULL i valori di tutte le colonne della tabella B e tutti i record della tabella di destra (“right”) B che non trovano corrispondenza nella tabella di sinistra (“left”) A impostando a NULL i valori di tutte le colonne della tabella A.

Esempio di una full outer join:

SELECT *  
FROM   Impiegati 
       FULL OUTER JOIN Dipartimenti 
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
Impiegati.CognomeImpiegati.ID_dipartimentoDipartimenti.Nome_dipartimentoDipartimenti.ID_dipartimento
Monti34Risorse umane34
Bianchi33Tecnico33
Santoro34Risorse umane34
GrassiNullNullNull
Mancini33Tecnico33
Rossi31Vendite31
NullNullPromozione35

Alcuni database (come ad esempio MySQL) non supportano direttamente questa funzionalità, ma la si può emulare attraverso la combinazione di left e right outer join per mezzo della keyword union.

La creazione di una query di full outer join si realizzerà come segue:

SELECT *
FROM   Impiegati 
       LEFT JOIN Dipartimenti 
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
UNION
SELECT *
FROM   Impiegati
       RIGHT JOIN Dipartimenti
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
WHERE  Impiegati.ID_dipartimento IS NULL

Allo stesso modo senza utilizzare nemmeno la query di right outer join:

SELECT Impiegati.*, Dipartimenti.*
FROM   Impiegati 
       LEFT JOIN Dipartimenti 
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
UNION
SELECT Impiegati.*, Dipartimenti.*
FROM   Dipartimenti
       LEFT JOIN Impiegati
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
WHERE  Impiegati.ID_dipartimento IS NULL
Translate »