Utilizzo di outer join
Anche se non comune come gli inner join, l'uso di outer join in una query su più tabelle può offrire una visualizzazione alternativa dei dati aziendali. Come per gli inner join, si esprimerà una relazione logica tra le tabelle. Tuttavia, verranno recuperate non solo le righe con attributi corrispondenti, ma anche tutte le righe presenti in una o in entrambe le tabelle, indipendentemente dal fatto che nella seconda tabella sia presente o meno una corrispondenza.
In precedenza, si è appreso come usare un INNER JOIN per trovare righe corrispondenti tra due tabelle. Come si è visto, Query Processor compila i risultati di una query INNER JOIN filtrando le righe che non soddisfano le condizioni espresse nel predicato della clausola ON. Come risultato, vengono restituite solo le righe con una riga corrispondente nella seconda tabella. Con un OUTER JOIN è possibile scegliere di visualizzare tutte le righe con corrispondenza tra le tabelle, oltre a tutte le righe senza corrispondenza nella seconda tabella. Verrà esaminato un esempio e quindi il processo.
Esaminare prima di tutto la query seguente, scritta con un INNER JOIN:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
INNER JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
Queste righe rappresentano una corrispondenza tra HR.Employee e Sales.SalesOrder. Nei risultati verranno visualizzati solo i valori EmployeeID presenti in entrambe le tabelle.
Verrà esaminata ora la query seguente, scritta come LEFT OUTER JOIN:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT OUTER JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
In questo esempio viene utilizzato un operatore LEFT OUTER JOIN, che indica a Query Processor di mantenere tutte le righe della tabella a sinistra (HR.Employee) e visualizza i valori Amount per le righe corrispondenti in Sales.SalesOrder. Tuttavia, vengono restituiti tutti i dipendenti, indipendentemente dal fatto che abbiano effettuato o meno un ordine di vendita. Al posto del valore Amount, la query restituirà NULL per i dipendenti senza ordini di vendita corrispondenti.
Sintassi INNER JOIN
Gli outer join vengono espressi usando le parole chiave LEFT, RIGHT o FULL che precedono OUTER JOIN. Lo scopo della parola chiave è indicare quale tabella (su quale lato della parola chiave JOIN) deve essere mantenuta e visualizzare tutte le relative righe, con o senza corrispondenza.
Quando si usa LEFT, RIGHT o FULL per definire un join, è possibile omettere la parola chiave OUTER come illustrato di seguito:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
Tuttavia, analogamente alla parola chiave INNER, è spesso utile scrivere codice esplicito per il tipo di join in uso.
Quando si scrivono query con inner join, tenere presenti le linee guida seguenti:
- Come si è visto, gli alias di tabella sono preferibili non solo per l'elenco SELECT, ma anche per la clausola ON.
- Come per INNER JOIN, OUTER JOIN può essere eseguito su una singola colonna corrispondente o su più attributi corrispondenti.
- A differenza di INNER JOIN, l'ordine in cui le tabelle sono elencate e unite in join nella clausola FROM è rilevante con OUTER JOIN, in quanto determina se si sceglie LEFT o RIGHT per il join.
- I join a più tabelle sono più complessi quando è presente un OUTER JOIN. La presenza di VALORI NULL nei risultati di un OUTER JOIN può causare problemi se i risultati intermedi vengono quindi uniti in join a una terza tabella. Le righe con valori NULL possono essere filtrate in base al predicato del secondo join.
- Per visualizzare solo le righe in cui non esiste alcuna corrispondenza, aggiungere un test per NULL in una clausola WHERE che segue un predicato OUTER JOIN.
- FULL OUTER JOIN viene usato raramente. Questo tipo di join restituisce tutte le righe con corrispondenza tra le due tabelle, oltre a tutte le righe della prima tabella senza corrispondenza nella seconda e tutte le righe della seconda tabella senza una corrispondenza nella prima.
- Non è possibile prevedere l'ordine in cui le righe verranno restituite senza una clausola ORDER BY. Non è possibile sapere se verranno restituite per prime le righe con o senza corrispondenza.