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 exibição alternativa dos dados da sua empresa. Tal como acontece com as junções internas, irá 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, independentemente de haver ou não uma correspondência na outra tabela.

Anteriormente, você aprendeu como usar um INNER JOIN para encontrar linhas correspondentes entre duas tabelas. Como você viu, o processador de consultas 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 apenas as 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. Vejamos um exemplo e, em seguida, exploremos o processo.

Primeiro, examine a seguinte consulta, escrita com uma JUNÇÃO INTERNA:

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

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

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

Agora, vamos examinar a seguinte consulta, escrita como 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 consultas para preservar todas as linhas da tabela à esquerda (HR. Employee) e exibe os valores Amount para linhas correspondentes em Sales.SalesOrder. No entanto, todos os funcionários são devolvidos, quer tenham ou não recebido uma ordem de venda. No lugar do valor Amount , a consulta retornará NULL para funcionários sem ordens de venda 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 precedendo OUTER JOIN. O objetivo da palavra-chave é indicar qual tabela (em que lado da palavra-chave JOIN) deve ser preservada e ter todas as suas linhas exibidas; match, ou no match.

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, como a palavra-chave INNER , muitas vezes é útil escrever um código que seja explícito sobre o tipo de junção que está sendo usada.

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

  • Como você viu, os aliases de tabela são preferidos não apenas para a lista SELECT, mas também para a cláusula ON.
  • Tal como acontece com uma JUNÇÃO INTERNA, uma JUNÇÃO EXTERNA pode ser executada numa única coluna correspondente ou em vários atributos correspondentes.
  • Ao contrário de uma JUNÇÃO INTERNA, a ordem em que as tabelas são listadas e unidas na cláusula FROM é importante com a JUNÇÃO EXTERNA, pois determinará se você escolhe ESQUERDA ou DIREITA para sua associação.
  • As junções de várias tabelas são mais complexas quando um OUTER JOIN está presente. A presença de NULLs nos resultados de um OUTER JOIN pode causar problemas se os resultados intermediários forem então unidos a uma terceira tabela. As linhas com NULLs podem ser filtradas pelo predicado da segunda junção.
  • Para exibir apenas linhas onde não existe correspondência, adicione um teste para NULL em uma cláusula WHERE seguindo um predicado OUTER JOIN.
  • Uma junção externa completa é usada raramente. Ele retorna todas as linhas correspondentes entre as duas tabelas, mais todas as linhas da primeira tabela sem correspondência na segunda, além de todas as linhas na segunda 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 incompatíveis serão retornadas primeiro.