Condividi tramite


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)

Guida in linea e informazioni

Assistenza su SQL Server 2005