Implementare del codice equivalente alla Full Join su 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.
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 successiva aggiungeremo le righe con i codici della Tabella B non presenti nella Tabella A. Ciò è possibile grazie all’utilizzo congiunto della RIGHT JOIN e della condizione nella WHERE.

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

Scroll to Top
Torna su