Il contrario di una INNER JOIN: ovvero ottenere i record non corrispondenti
Chi ha conoscenze di SQL sa cosa sono le JOIN. Nelle nostre guide ed in diversi articoli abbiamo spiegato come funzionano le JOIN e come è possibile creare delle relazioni fra le diverse tabelle di un database.
L'esigenza più comune soddisfatta dallo strumento JOIN è quella di individuare le corrispondenze tra due tabelle; in tal caso soccorre la clausola INNER JOIN che, appunto, individua e restituisce i campi che soddisfano la corrispondenza cercata all'interno delle due o più tabelle coinvolte nella JOIN.
Decisamente meno intuitiva è l'esigenza contraria di individuare i campi che non hanno una corrispondenza all'interno della JOIN.
Facciamo un esempio.
Supponiamo di dover gestire un database di un sito di e-commerce composto da due sole tabelle:
- clienti (contenente l'anagrafica della clientela)
- ordini (contenente gli ordini effettuati dai clienti)
Soddisfare la prima esigenza, come sappiamo, è piuttosto semplice:
SELECT clienti.nome, clienti.cognome FROM clienti INNER JOIN ordini ON clienti.id = ordini.id_cliente ORDER BY clienti.cognome ASCe fin qui nessun problema.
Ma come possiamo fare per ottenere il risultato inverso? Beh... per prima cosa non utilizzeremo una INNER JOIN ma una LEFT JOIN al fine di cercare non una corrispondenza piena ma una parziale dove, comunque, i risultati della tabella di sinistra vengono restituiti ugualmente.
Fatto questo andremo a cercare (mediante la clausola WHERE) i record mancanti (cioè non riscontrati all'interno della relazione) quindi identificati come NULL (nel linguaggio SQL si definisce come NULL una sorta di "valore speciale" che identifica un'assenza di valore.).
Vediamo il codice:
SELECT clienti.nome, clienti.cognome FROM clienti LEFT JOIN ordini ON clienti.id = ordini.id_cliente WHERE ordini.id_cliente IS NULL ORDER BY clienti.cognome ASCIl risultato sarà, appunto, l'elenco dei nominativi dei nostri clienti che non hanno mai acquistato nulla.







