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.
Microsoft In SQL Server 2005, per gli outer join specificati in una clausola FROM vengono utilizzate le parole chiave SQL-92 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 SQL-92, come è illustrato nella query seguente:
USE AdventureWorks;
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 SQL-92, 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 SQL-92. La query Transact-SQL dell'outer join destro è la seguente:
USE AdventureWorks;
GO
SELECT st.Name AS Territory, sp.SalesPersonID
FROM Sales.SalesTerritory st
RIGHT OUTER JOIN Sales.SalesPerson sp
ON st.TerritoryID = sp.TerritoryID ;
Set di risultati:
Territory SalesPersonID
-------------------------------------------------- -------------
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 row(s) affected)
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 AdventureWorks;
GO
SELECT st.Name AS Territory, sp.SalesPersonID
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 SQL-92 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 AdventureWorks;
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 ;
Vedere anche
Concetti
Utilizzo di operatori nelle espressioni
Altre risorse
Operatori (Transact-SQL)
SELECT (Transact-SQL)
Esempi di istruzioni SELECT (Transact-SQL)