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 ;