Usando junções externas

As junções externas retornam linhas apenas quando há pelo menos uma linha nas tabelas que corresponde à condição da junção. As junções internas eliminam as linhas que não correspondem a uma linha da outra tabela. Entretanto, as junções externas retornam todas as linhas de pelo menos uma das tabelas ou exibições mencionadas na cláusula FROM, contanto que essas linhas atendam algum critério de pesquisa WHERE ou HAVING. Todas as linhas são recuperadas da tabela esquerda referenciada com uma junção externa esquerda, e todas as linhas da tabela direita referenciada na junção externa direita. São retornadas todas as linhas de ambas as tabelas em uma junção externa completa.

O SQL Server usa as seguintes palavras-chave ISO para as junções externas especificadas em uma cláusula FROM:

  • LEFT OUTER JOIN ou LEFT JOIN

  • RIGHT OUTER JOIN ou RIGHT JOIN

  • FULL OUTER JOIN ou FULL JOIN

Usando junções externas esquerdas

Considere uma junção da tabela Product e da tabela ProductReview em suas colunas ProductID. Os resultados mostram apenas os produtos para os quais revisões foram gravadas.

Para incluir todos os produtos, independentemente de uma revisão ter sido escrita para um, use uma junção externa esquerda ISO. A seguir visualize uma consulta:

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

LEFT OUTER JOIN inclui todas as linhas da tabela Product nos resultados, havendo ou não uma correspondência na coluna ProductID da tabela ProductReview. Observe que nos resultados em que não há uma ID de revisão de produto correspondente para um produto, a linha contém um valor nulo na coluna ProductReviewID.

Usando junções externas direitas

Considere uma tabela de junção SalesTerritory e a tabela SalesPerson em suas colunas TerritoryID. Os resultados mostram todos os territórios atribuídos a um vendedor. O operador de junção externa direita ISO, RIGHT OUTER JOIN indica que todas as linhas da segunda tabela serão incluídas nos resultados, independentemente de haver ou não dados correspondentes na primeira tabela.

Para incluir todos os vendedores nos resultados, a despeito de lhes ter sido atribuído um território, use uma junção externa direita ISO. Observe a consulta do Transact-SQL e os resultados da junção externa direita:

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 ;

Aqui está o conjunto de resultados.

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 linhas afetadas)

Uma junção externa pode ser restrita pelo uso de predicado. Esse exemplo contém a mesma junção externa direita, mas só inclui territórios de vendas com vendas abaixo de $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;

Para obter mais informações sobre predicados, consulte WHERE (Transact-SQL).

Usando junções externas completas

Para reter informações não correspondentes mediante a inclusão de linhas não correspondentes nos resultados de uma junção, use uma junção externa completa. O SQL Server fornece um operador de junção externa completa, FULL OUTER JOIN, que inclui todas as linhas de ambas as tabelas, independentemente de a outra tabela ter ou não um valor correspondente.

Considere uma junção da tabela Product e da tabela SalesOrderDetail em suas colunas ProductID. Os resultados mostram apenas os produtos com ordens de vendas. O operador ISO FULL OUTER JOIN indica que todas as linhas de ambas as tabelas serão incluídas nos resultados, a despeito de haver ou não dados correspondentes nas tabelas.

É possível incluir uma cláusula WHERE com uma junção externa completa para retornar apenas as linhas em que não há dados correspondentes entre as tabelas. A consulta a seguir retorna apenas os produtos que não têm ordens de vendas correspondentes, assim como as ordens de vendas que não correspondem a um produto (embora todas as ordens de vendas, no caso, sejam correspondentes a um produto).

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 ;