Utilizzo di outer join
Anche se non così comuni come gli inner join, l'uso degli outer join in una query su più tabelle può offrire una prospettiva alternativa sui dati aziendali. Come per i inner join, si esprimerà una relazione logica tra le tabelle. Tuttavia, si recupereranno non solo le righe con attributi corrispondenti, ma anche tutte le righe presenti in una o entrambe le tabelle, indipendentemente dal fatto che sia presente una corrispondenza nell'altra tabella.
In precedenza si è appreso come usare inner JOIN per trovare le 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. Il risultato è che vengono restituite solo le righe con una riga corrispondente nell'altra tabella. Con outer join è possibile scegliere di visualizzare tutte le righe con righe corrispondenti tra le tabelle, oltre a tutte le righe che non hanno una corrispondenza nell'altra tabella. Si esaminerà un esempio, quindi si esaminerà il processo.
Prima di tutto, esamina la query seguente, scritta con 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 usato un operatore LEFT OUTER JOIN, che indirizza Query Processor a mantenere tutte le righe della tabella a sinistra (HR. Employee) e visualizza i valori Amount per le righe corrispondenti in Sales.SalesOrder. Tuttavia, tutti i dipendenti vengono restituiti, indipendentemente dal fatto che abbiano preso 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, come la parola chiave INNER, è spesso utile scrivere codice esplicito sul tipo di join in uso.
Quando si scrivono query con OUTER JOIN, tenere presenti le linee guida seguenti:
- Come si è visto, gli alias di tabella sono preferiti non solo per l'elenco SELECT, ma anche per la clausola ON.
- Come per inner join, un OUTER JOIN può essere eseguito su una singola colonna corrispondente o su più attributi corrispondenti.
- A differenza di un INNER JOIN, l'ordine in cui le tabelle vengono elencate e unite 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 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. Restituisce tutte le righe corrispondenti tra le due tabelle, più tutte le righe della prima tabella senza corrispondenza nel secondo, più tutte le righe nel secondo senza una corrispondenza nella prima.
- Non è possibile stimare l'ordine in cui le righe verranno restituite senza una clausola ORDER BY. Non è possibile sapere se le righe corrispondenti o non corrispondenti verranno restituite per prime.