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
in questo modo
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 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
- Come creare una tabella Pivot con SQL
- Convertire righe in colonne con SQL
- Estrarre l’elenco degli indici da SQL Server