Usar junções externas

Concluído

Embora não seja tão comum quanto as junções internas, o uso de junções externas em uma consulta de várias tabelas pode fornecer uma visão alternativa dos dados do negócio. Assim como ocorre com as junções internas, você vai expressar uma relação lógica entre as tabelas. No entanto, você vai recuperar as linhas com atributos correspondentes e também todas as linhas presentes em uma ou nas duas tabelas, havendo ou não uma correspondência na outra tabela.

Você aprendeu a usar uma INNER JOIN para localizar linhas correspondentes entre duas tabelas. Como vimos, o processador de consultas cria os resultados de uma consulta INNER JOIN filtrando as linhas que não atendem às condições expressas no predicado da cláusula ON. Como resultado, apenas as linhas com uma linha correspondente na outra tabela são retornadas. Com uma OUTER JOIN, você pode exibir todas as linhas com correspondência entre as tabelas e também aquelas que não têm correspondência na outra tabela. Vamos dar uma olhada em 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 combinação entre RH.Employee e Sales.SalesOrder. Somente os valores EmployeeID que estão nas duas tabelas vão aparecer nos resultados.

A Venn diagram showing the matching members of the Employee and SalesOrder sets

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;

Esse exemplo usa um operador LEFT OUTER JOIN, que orienta o processador de consulta a preservar todas as linhas da tabela à esquerda (HR.Employee) e exibe os valores em Amount das linhas correspondentes em Sales.SalesOrder. No entanto, todos os funcionários são retornados, mesmo que não tenham feito uma ordem de venda. No lugar do valor em Amount, a consulta vai retornar NULL para os funcionários sem ordens de vendas correspondentes.

A Venn diagram showing the outer join results of the Employee and SalesOrder sets

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, como 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, assim como a palavra-chave INNER, é útil gravar um código que seja claro sobre o tipo de junção que está sendo usado.

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

  • Como visto anteriormente, os aliases de tabela são preferenciais não apenas para a lista SELECT, mas também para a cláusula ON.
  • Assim como a INNER JOIN, a OUTER JOIN 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 uma 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. Ela retorna as linhas correspondentes entre as duas tabelas, as linhas da primeira tabela sem correspondência na segunda e as linhas da segunda sem correspondência na primeira.
  • Não é possível prever a ordem em que as linhas vão retornar 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.