Usar auto-associações

Concluído

Até agora, as junções que usamos envolveram diferentes tabelas. Pode haver cenários em que você precise recuperar e comparar linhas de uma tabela com outras linhas da mesma tabela. Por exemplo, em um aplicativo de recursos humanos, uma tabela Employee pode incluir informações sobre o gerente de cada funcionário e armazenar o ID do gerente na própria linha do funcionário. Cada gerente também é listado como um funcionário.

EmployeeID

FirstName

ID do Gerente

1

Danilo

NULL

2

Aisha

1

3

Rosie

1

4

Noemi

3

Para recuperar as informações do funcionário e combiná-las com o gerente relacionado, você pode usar a tabela duas vezes em sua consulta, unindo-a a si mesma para os fins da consulta.

SELECT emp.FirstName AS Employee, 
       mgr.FirstName AS Manager
FROM HR.Employee AS emp
LEFT OUTER JOIN HR.Employee AS mgr
  ON emp.ManagerID = mgr.EmployeeID;

Os resultados dessa consulta incluem uma linha para cada funcionário com o nome de seu gerente. O CEO da empresa não tem gerente. Para incluir o CEO nos resultados, uma associação externa é usada e o nome do gerente é retornado como NULL para linhas em que o campo ManagerID não tem campo EmployeeID correspondente.

Colaborador

Gestor

Danilo

NULL

Aisha

Danilo

Rosie

Danilo

Noemi

Rosie

Há outros cenários em que você desejará comparar linhas em uma tabela com linhas diferentes na mesma tabela. Como você viu, é bastante fácil comparar colunas na mesma linha usando T-SQL, mas o método para comparar valores de linhas diferentes (como uma linha que armazena uma hora de início e outra linha na mesma tabela que armazena um tempo de parada correspondente) é menos óbvio. As auto-junções são uma técnica útil para esses tipos de consultas.

Para realizar tarefas como esta, você deve considerar as seguintes diretrizes:

  • Defina duas instâncias da mesma tabela na cláusula FROM e junte-as conforme necessário, usando junções internas ou externas.
  • Use aliases de tabela para diferenciar as duas instâncias da mesma tabela.
  • Use a cláusula ON para fornecer um filtro comparando colunas de uma instância da tabela com colunas da outra instância da tabela.