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 AdventureWorks;
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. A seguir visualize a consulta do Transact-SQL e os resultados da junção externa direita:

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 ;

Conjunto de resultados.

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)

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 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;

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 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 ;