Usar junções internas

Concluído

O tipo mais frequente de JOIN em consultas T-SQL é INNER JOIN. As junções internas são usadas para resolver muitos problemas comuns de negócios, especialmente em ambientes de banco de dados altamente normalizados. Para recuperar dados que foram armazenados em várias tabelas, muitas vezes você precisará combiná-los por meio de consultas INNER JOIN. Um INNER JOIN começa sua fase de processamento lógico como um produto cartesiano, que é filtrado para remover quaisquer linhas que não correspondam ao predicado.

Processando uma JUNÇÃO INTERNA

Vamos examinar as etapas pelas quais o SQL Server processará logicamente uma consulta JOIN. Os números de linha no exemplo hipotético a seguir são adicionados para maior clareza:

1) SELECT emp.FirstName, ord.Amount
2) FROM HR.Employee AS emp 
3) JOIN Sales.SalesOrder AS ord
4)      ON emp.EmployeeID = ord.EmployeeID;

Como você deve estar ciente, a cláusula FROM será processada antes da cláusula SELECT. Vamos acompanhar o processamento, começando com a linha 2:

  • A cláusula FROM especifica o RH. Tabela de funcionários como uma das tabelas de entrada, dando-lhe o alias emp.
  • O operador JOIN na linha 3 reflete o uso de um INNER JOIN (o tipo padrão em T-SQL) e especifica Sales.SalesOrder como a outra tabela de entrada, que tem um alias de ord.
  • O SQL Server executará uma junção cartesiana lógica nessas tabelas e passará os resultados como uma tabela virtual para a próxima etapa. (O processamento físico da consulta pode realmente não executar a operação cartesiana do produto, dependendo das decisões do otimizador. Mas pode ser útil imaginar o produto cartesiano sendo criado.)
  • Usando a cláusula ON, o SQL Server filtrará a tabela virtual, mantendo apenas as linhas em que um valor EmployeeID da tabela emp corresponde a um EmployeeID na tabela ord.
  • As linhas restantes são deixadas na tabela virtual e passadas para a próxima etapa na instrução SELECT. Neste exemplo, a tabela virtual é processada em seguida pela cláusula SELECT e as duas colunas especificadas são retornadas ao aplicativo cliente.

O resultado da consulta concluída é uma lista de funcionários e seus valores de pedidos. Os funcionários que não têm nenhum pedido associado foram filtrados pela cláusula ON, assim como todos os pedidos que por acaso têm um EmployeeID que não corresponde a uma entrada no RH. Tabela de funcionários .

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

Sintaxe INNER JOIN

Um INNER JOIN é o tipo padrão de JOIN e a palavra-chave opcional INNER está implícita na cláusula JOIN. Ao misturar e combinar tipos de junção, pode ser útil especificar o tipo de junção explicitamente, como mostrado neste exemplo hipotético:

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

Ao escrever consultas usando junções internas, considere as seguintes diretrizes:

  • Os aliases de tabela são preferidos, não apenas para a lista SELECT, mas também para escrever a cláusula ON.
  • As junções internas podem ser executadas em uma única coluna correspondente, como um OrderID, ou em vários atributos correspondentes, como a combinação de OrderID e ProductID. As junções que especificam várias colunas correspondentes são chamadas de junções compostas .
  • A ordem na qual as tabelas são listadas na cláusula FROM para um INNER JOIN não importa para o otimizador do SQL Server. Conceitualmente, as junções serão avaliadas da esquerda para a direita.
  • Use a palavra-chave JOIN uma vez para cada par de tabelas unidas na lista FROM. Para uma consulta de duas tabelas, especifique uma associação. Para uma consulta de três tabelas, você usará JOIN duas vezes; uma vez entre as duas primeiras tabelas, e mais uma vez entre a saída da JOIN entre as duas primeiras tabelas e a terceira tabela.

Exemplos de INNER JOIN

O exemplo hipotético a seguir executa uma junção em uma única coluna correspondente, relacionando o ProductModelID na tabela Production.Product ao ProductModelID na tabela Production.ProductModel:

SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID
ORDER BY p.ProductID;

Este próximo exemplo mostra como uma junção interna pode ser estendida para incluir mais de duas tabelas. A tabela Sales.SalesOrderDetail é unida à saída do JOIN entre Production.Product e Production.ProductModel. Cada instância de JOIN/ON faz sua própria população e filtragem da tabela de saída virtual. O otimizador de consulta do SQL Server determina a ordem na qual as junções e a filtragem serão executadas.

SELECT od.SalesOrderID, m.Name AS Model, p.Name AS ProductName, od.OrderQty
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID
INNER JOIN Sales.SalesOrderDetail AS od
    ON p.ProductID = od.ProductID
ORDER BY od.SalesOrderID;