Full Join in MySQL: come implementarla

full join in mysql

Il dialetto SQL del noto database MySQL è purtroppo privo dell’operatore FULL JOIN (o FULL OUTER JOIN). In questo articolo vediamo come scrivere una query equivalente combinando opportunamente una Left Join e una Right Join.

Ricorda: non copiare e incollare il codice senza aver effettuato tutti i test necessari per ogni caso specifico.

 

Esempio di utilizzo di FULL JOIN

Supponiamo di avere due tabelle:

Tabella A
CodiceAValoreA
1a
2b
Tabella B
CodiceBValoreB
1c
3d

e di voler combinare le due tabelle in modo da riportare tutte e 4 le colonne visualizzando anche

  • i codice della Tabella A non presenti nella Tabella B
  • i codice della Tabella B non presenti nella Tabella A

in questo modo

A FULL JOIN B
CodiceACodiceBValoreAValoreB
11ac
2NULLbNULL
NULL3NULLd

Su altri RDBMS come SQL Server e Oracle potremmo scrivere

SELECT  A.CodiceA, 
  B.CodiceB, 
  A.ValoreA, 
  B.ValoreB
FROM TabellaA AS A
FULL JOIN TabellaB AS B
   ON A.CodiceA = B.CodiceB;

 

Come implementare la Full Join in MySQL

Come detto all’inizio, l’operatore Full Join non è disponibile su MySQL, tuttavia possiamo raggiungere lo stesso output in questo modo:

SELECT  A.CodiceA, 
  B.CodiceB, 
  A.ValoreA, 
  B.ValoreB
FROM TabellaA AS A
LEFT JOIN TabellaB AS B
   ON A.CodiceA = B.CodiceB
UNION ALL
SELECT  A.CodiceA, 
  B.CodiceB, 
  A.ValoreA, 
  B.ValoreB 
FROM TabellaA AS A 
RIGHT JOIN TabellaB AS B 
  ON A.CodiceA = B.CodiceB
WHERE A.CodiceA IS NULL;

Con la prima Left Join generiamo le righe con:

  • corrispondenza tra i codici della Tabella A e della Tabella B
  • i codice della Tabella A non presenti nella Tabella B

Tramite la UNION ALL aggiungiamo le righe della seconda query:

  • grazie al filtro WHERE A.CodiceA IS NULL saranno presenti solo le righe con i codice della Tabella B non presenti nella Tabella A.

Sottolineo infine che sostituire Union All con Union avrebbe l’effetto aggiuntivo di eliminare eventuali duplicati dall’output finale. In questo caso specifico non ci sarebbero differenze, ma in generale occorre ricordare che l’operazione di Full Join non effettua nessuna rimozione, quindi è sicuramente più corretto usare Union All.

 

Continua a imparare

Torna su