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 | |
CodiceA | ValoreA |
1 | a |
2 | b |
Tabella B | |
CodiceB | ValoreB |
1 | c |
3 | d |
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 | |||
CodiceA | CodiceB | ValoreA | ValoreB |
1 | 1 | a | c |
2 | NULL | b | NULL |
NULL | 3 | NULL | d |
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
- Questa era l’ultima lezione della guida SQL! Visita la sezione del blog sulle performance di SQL Server
- Torna all’indice delle lezioni
- Visita la pagina del mio videocorso SQL