Usar junções externas

Concluído

Embora não seja tão comum quanto junções internas, o uso de junções externas em uma consulta de várias tabelas pode fornecer uma exibição alternativa dos dados de negócios. Assim como acontece com as junções internas, você expressará uma relação lógica entre as tabelas. No entanto, você recuperará não apenas linhas com atributos correspondentes, mas também todas as linhas presentes em uma ou ambas as tabelas, quer haja ou não uma correspondência na outra tabela.

Anteriormente, você aprendeu a usar um INNER JOIN para encontrar linhas correspondentes entre duas tabelas. Como você viu, o processador de consulta cria os resultados de uma consulta INNER JOIN filtrando linhas que não atendem às condições expressas no predicado da cláusula ON. O resultado é que somente linhas com uma linha correspondente na outra tabela são retornadas. Com um OUTER JOIN, você pode optar por exibir todas as linhas que têm linhas correspondentes entre as tabelas, além de todas as linhas que não têm uma correspondência na outra tabela. Vamos examinar um exemplo e explorar o processo.

Examine a seguinte consulta, gravada com uma INNER JOIN:

SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
INNER JOIN Sales.SalesOrder AS ord
    ON emp.EmployeeID = ord.EmployeeID;

Essas linhas representam uma correspondência entre RH.Funcionário e Vendas.PedidoDeVenda. Somente os valores EmployeeID que estão em ambas as tabelas aparecerão nos resultados.

Um diagrama de Venn mostrando os membros correspondentes dos conjuntos Employee e SalesOrder

Agora examine a seguinte consulta, gravada com uma LEFT OUTER JOIN:

SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT OUTER JOIN Sales.SalesOrder AS ord
    ON emp.EmployeeID = ord.EmployeeID;

Este exemplo usa um operador LEFT OUTER JOIN, que direciona o processador de consulta para preservar todas as linhas da tabela à esquerda (RH.Funcionário) e exibe os valores de Montante para linhas correspondentes em Sales.SalesOrder. No entanto, todos os funcionários são retornados, independentemente de terem feito ou não um pedido de vendas. No lugar do valor em Amount, a consulta vai retornar NULL para os funcionários sem ordens de vendas correspondentes.

Um diagrama venn mostrando os resultados de junção externa dos conjuntos Employee e SalesOrder

Sintaxe OUTER JOIN

As junções externas são expressas usando as palavras-chave LEFT, RIGHT ou FULL antes de OUTER JOIN. A finalidade da palavra-chave é indicar qual tabela (em qual lado da palavra-chave JOIN) deve ser preservada e ter todas as linhas exibidas, com ou sem correspondência.

Ao usar LEFT, RIGHT ou FULL para definir uma junção, você pode omitir a palavra-chave OUTER, conforme mostrado aqui:

SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT JOIN Sales.SalesOrder AS ord
    ON emp.EmployeeID = ord.EmployeeID;

No entanto, como a palavra-chave INNER, muitas vezes é útil escrever um código explícito sobre o tipo de junção que está sendo usado.

Ao escrever consultas usando OUTER JOIN, considere as seguintes diretrizes:

  • Como você viu, os aliases de tabela são preferenciais não apenas para a lista SELECT, mas também para a cláusula ON.
  • Assim como ocorre com uma JUNÇÃO INTERNA, uma JUNÇÃO EXTERNA pode ser executada em uma única coluna correspondente ou em vários atributos correspondentes.
  • Ao contrário da INNER JOIN, a ordem na qual as tabelas são listadas e unidas na cláusula FROM é importante para a OUTER JOIN, pois ela vai determinar a escolha entre LEFT ou RIGHT da junção.
  • Junções de várias tabelas são mais complexas quando um OUTER JOIN está presente. A presença de NULLs nos resultados de uma OUTER JOIN pode causar problemas se os resultados intermediários forem unidos a uma terceira tabela. Linhas com valores NULLs podem ser filtradas pelo predicado da segunda junção.
  • Para exibir somente as linhas nas quais não há correspondência, adicione um teste para NULL em uma cláusula WHERE após um predicado OUTER JOIN.
  • Uma FULL OUTER JOIN é usada raramente. Ele retorna todas as linhas correspondentes entre as duas tabelas, além de todas as linhas da primeira tabela sem correspondência na segunda, além de todas as linhas na segunda tabela sem uma correspondência na primeira.
  • Não há como prever a ordem em que as linhas voltarão sem uma cláusula ORDER BY. Não há como saber se as linhas correspondentes ou as não correspondentes vão ser retornadas primeiro.