In SQL Server, a volte è necessario recuperare, oltre alle righe corrispondenti, le righe non corrispondenti da una o entrambe le tabelle. Tale operazione è chiamata join esterno.
Gli esempi 1 e 2 mostrano la differenza tra un join naturale e il join esterno corrispondente. (Tutti gli esempi in questa sezione utilizzano la tabella employee_enh.,)
ESEMPIO 1
Ottenere i dettagli completi di tutti i dipendenti, tra cui la posizione del proprio reparto, che vivono e lavorano nella stessa città:
Il risultato è:
Esempio 1 utilizza un join naturale per visualizzare il set di righe. Se si desidera conoscere tutti gli altri luoghi di vita esistenti dei dipendenti, è necessario utilizzare il join esterno (a sinistra). Questo è chiamato un join esterno sinistro perché vengono restituite tutte le righe della tabella sul lato sinistro dell’operatore, indipendentemente dal fatto che abbiano o meno una riga corrispondente nella tabella a destra., In altre parole, se non ci sono righe corrispondenti nella tabella sul lato destro, il join esterno restituirà comunque una riga dalla tabella sul lato sinistro, con NULL in ogni colonna dell’altra tabella (vedi esempio 2). Il motore di database utilizza l’operatore LEFT OUTER JOIN per specificare il left outer join.
Un join esterno destro è simile, ma restituisce tutte le righe della tabella a destra del simbolo. Il motore di database utilizza l’operatore RIGHT OUTER JOIN per specificare il right outer join.,
ESEMPIO 2
Ottenere i dettagli completi di tutti i dipendenti, tra cui la posizione del proprio reparto, per tutte le città sono il luogo in cui vivevano solo o entrambi i di vita e di lavoro di dipendenti:
Il risultato è:
Come si può vedere, quando non c’è la riga corrispondente nella tabella sul lato destro (reparto, in questo caso), il left outer join restituisce ancora le righe della tabella sul lato sinistro (employee_enh), e le colonne della tabella sono popolate da valori NULL., L’esempio 3 mostra l’uso dell’operazione di join esterno destro.
ESEMPIO 3
Ottenere i dettagli completi di tutti i reparti, così come tutti i luoghi di vita dei loro dipendenti, per tutte le città che sono sia la posizione di un reparto o di una vita e di lavoro di un dipendente:
Il risultato è:
In aggiunta a left e right outer join, c’è anche il full outer join, che è definita come l’unione di sinistra e right outer join. In altre parole, tutte le righe di entrambe le tabelle sono rappresentate nel set di risultati., Se non c’è una riga corrispondente in una delle tabelle, le sue colonne vengono restituite con valori NULL. Questa operazione viene specificata utilizzando l’operatore di JOIN ESTERNO COMPLETO.
Ogni operazione di join esterno può essere simulata utilizzando l’operatore UNION più la funzione NOT EXISTS. L’esempio 4 è equivalente all’esempio con il join esterno sinistro (esempio 2).,
ESEMPIO 4
Ottieni tutti i dettagli di tutti i dipendenti, inclusa la posizione del loro dipartimento, per tutte le città che sono solo il luogo di vita o entrambi i luoghi di vita e di lavoro dei dipendenti:
La prima istruzione SELECT nell’unione specifica il join naturale delle tabelle employee_enh e department con le colonne join domicilio e location. Questa istruzione SELECT recupera tutte le città che sono allo stesso tempo i luoghi di vita e di lavoro di ciascun dipendente., La seconda istruzione SELECT nell’unione recupera, inoltre, tutte le righe dalla tabella employee_enh che non corrispondono alla condizione nel join naturale.