Utilizzo di outer join

Gli inner join restituiscono righe solo se entrambe le tabelle includono almeno una riga che rispetta la condizione di join e le righe prive di corrispondenza nell'altra tabella vengono eliminate. Gli outer join restituiscono invece tutte le righe di almeno una delle tabelle o viste specificate nella clausola FROM, a condizione che tali righe soddisfino una delle condizioni di ricerca della clausola WHERE o HAVING. Vengono recuperate tutte le righe della tabella di sinistra a cui viene fatto riferimento in un outer join sinistro e tutte le righe della tabella di destra a cui fa riferimento un outer join destro. Con un full outer join vengono restituite tutte le righe di entrambe le tabelle.

In SQL Server, per gli outer join specificati in una clausola FROM vengono utilizzate le parole chiave ISO seguenti:

  • LEFT OUTER JOIN o LEFT JOIN

  • RIGHT OUTER JOIN o RIGHT JOIN

  • FULL OUTER JOIN o FULL JOIN

Utilizzo di un outer join sinistro

Si supponga di creare un join tra la tabella Product e la tabella ProductReview basato sulla colonna ProductID delle due tabelle. Nei risultati vengono visualizzati solo i prodotti per cui sono state redatte analisi di prodotto.

Per includere tutti i prodotti, indipendentemente dal fatto che sia stata redatta o meno un'analisi per uno di essi, è possibile utilizzare un outer join sinistro ISO. come è illustrato nella query seguente:

USE AdventureWorks2008R2;
GO
SELECT p.Name, pr.ProductReviewID
FROM Production.Product p
LEFT OUTER JOIN Production.ProductReview pr
ON p.ProductID = pr.ProductID

L'operatore LEFT OUTER JOIN include nei risultati tutte le righe della tabella Product, indipendentemente dal fatto che esista o meno una corrispondenza nella colonna ProductID della tabella ProductReview. Si noti che se nei risultati non esiste un valore ProductReviewID corrispondente al prodotto, la colonna ProductReviewID della riga conterrà un valore Null.

Utilizzo di un outer join destro

Si supponga di creare un join tra la tabella SalesTerritory e la tabella SalesPerson basato sulla colonna TerritoryID delle due tabelle. Nei risultati vengono visualizzate le aree assegnate a un venditore. L'operatore di outer join destro ISO, ovvero RIGHT OUTER JOIN, indica che tutte le righe della seconda tabella devono essere incluse nei risultati, indipendentemente dal fatto che esista o meno una corrispondenza nella prima tabella.

Per includere tutti i venditori nei risultati, indipendentemente dal fatto che sia stata loro assegnata un'area, è possibile utilizzare un outer join destro ISO. La query Transact-SQL dell'outer join destro è la seguente:

USE AdventureWorks2008R2;
GO
SELECT st.Name AS Territory, sp.BusinessEntityID
FROM Sales.SalesTerritory st 
RIGHT OUTER JOIN Sales.SalesPerson sp
ON st.TerritoryID = sp.TerritoryID ;

Set di risultati:

Territory BusinessEntityID

-------------------------------------------------- -------------

NULL 268

Northeast 275

Southwest 276

Central 277

Canada 278

Southeast 279

Northwest 280

Southwest 281

Canada 282

Northwest 283

NULL 284

United Kingdom 285

France 286

Northwest 287

NULL 288

Germany 289

Australia 290

(17 righe interessate)

Per limitare ulteriormente un outer join è possibile utilizzare un predicato. L'esempio seguente include lo stesso outer join destro, ma solo le aree di vendita con vendite inferiori a $ 2.000.000.

USE AdventureWorks2008R2;
GO
SELECT st.Name AS Territory, sp.BusinessEntityID
FROM Sales.SalesTerritory st 
RIGHT OUTER JOIN Sales.SalesPerson sp
ON st.TerritoryID = sp.TerritoryID 
WHERE st.SalesYTD < $2000000;

Per ulteriori informazioni sui predicati, vedere WHERE (Transact-SQL).

Utilizzo di un full outer join

Per includere nei risultati di un join le righe prive di corrispondenza, è possibile utilizzare un full outer join. In SQL Server è disponibile l'operatore FULL OUTER JOIN, che consente di includere tutte le righe di entrambe le tabelle, indipendentemente dalla presenza o meno di valori corrispondenti.

Si supponga di creare un join tra la tabella Product e la tabella SalesOrderDetail basato sulla colonna ProductID delle due tabelle. Nei risultati vengono visualizzati solo i prodotti per i quali sono stati emessi ordini di vendita. L'operatore ISO FULL OUTER JOIN indica che tutte le righe di entrambe le tabelle devono essere incluse nei risultati, indipendentemente dalla presenza o meno di valori corrispondenti nelle tabelle.

È possibile inserire una clausola WHERE in un full outer join per ottenere solo le righe per le quali non esistono corrispondenze nelle tabelle. La query seguente restituisce unicamente i prodotti per i quali non esistono corrispondenze negli ordini di vendita, nonché gli ordini di vendita per cui non esistono corrispondenze con un prodotto (anche se in questo caso per tutti gli ordini di vendita esiste una corrispondenza di prodotto).

USE AdventureWorks2008R2;
GO
-- The OUTER keyword following the FULL keyword is optional.
SELECT p.Name, sod.SalesOrderID
FROM Production.Product p
FULL OUTER JOIN Sales.SalesOrderDetail sod
ON p.ProductID = sod.ProductID
WHERE p.ProductID IS NULL
OR sod.ProductID IS NULL
ORDER BY p.Name ;