Usar autojunções

Concluído

Até agora, as junções utilizadas envolveram tabelas diferentes. Pode haver cenários em que você precisa recuperar e comparar as 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 a ID do gerente na mesma linha do funcionário. Cada gerente também é listado como um funcionário.

EmployeeID

Nome

ManagerID

1

Dan

NULO

2

Aisha

1

3

Rosie

1

4

Naomi

3

Para recuperar as informações do funcionário e fazer a comparação com o gerente relacionado, você pode usar a tabela duas vezes na consulta, unindo-a a si mesma para propósitos 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 do respectivo gerente. O CEO da empresa não tem nenhum gerente. Para incluir o CEO nos resultados, uma junção externa é usada e o nome do gerente é retornado como NULL nas linhas em que o campo ManagerID não tem nenhum campo EmployeeID correspondente.

Employee

Gerente

Dan

NULO

Aisha

Dan

Rosie

Dan

Naomi

Rosie

Há outros cenários nos quais você vai desejar comparar as linhas de uma tabela com linhas diferentes da mesma tabela. Como você viu, é bem fácil comparar colunas da mesma linha usando o 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 a hora final correspondente) é menos óbvio. As autojunções são uma técnica útil para esses tipos de consultas.

Para realizar tarefas como essa, considere as seguintes diretrizes:

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