DEV Community

Airton Carneiro
Airton Carneiro

Posted on

Você comete este erro no Left Join?

Você comete este erro no Left Join?

Imagem de capa do artigo

Imagina que está chegando o dia das crianças e que sua empresa irá promover uma confraternização entre todos os funcionários e também oferecer um espaço de brincadeiras para os filhos daqueles. Então, você recebe como missão entregar a relação de todos os funcionários e seus respectivos filhos menores de 18 anos.

Vamos supor que temos as seguintes tabelas:

Exibição das duas tabelas usadas

Você começa a fazer a consulta SQL e sabe que nem todos os funcionários possuem filhos. Assim, você usará o left join e monta a seguinte query:

SELECT
  F.nome  func\_nome
  ,D.nome depend\_nome
  ,D.idade depend\_idade
FROM FUNCIONARIO F
LEFT JOIN DEPENDENTE
  ON D.func\_id = F.id
WHERE  D.idade < 18
Enter fullscreen mode Exit fullscreen mode

Por incrível que parece, já vi muitas consultas com este tipo de erro. Se você não percebeu o erro, vejamos o retorno da query:

tabela de funcionários

Como percebido, temos o funcionário José Bonifácio na lista e o Pe. José de Anchieta, não. O resultado esperado seria:

tabela de dependentes

Por que o erro acontece? Porque quando levamos algum campo idade (que pertence à tabela do LEFT JOIN) para a cláusula WHERE, o SGBD passa a fazer um INNER JOIN. Vejamos o plano de execução gerado para esta consulta:

plano de execução para inner join

Grifado em amarelo está como o BD "monta" a consulta. Ela usou um INNER JOIN! Assim, a consulta certa seria:

SELECT
  F.nome   AS 'func\_nome'
  ,D.nome  AS 'depend\_nome'
  ,D.idade AS 'depend\_idade'
FROM FUNCIONARIO F
LEFT JOIN DEPENDENTE D
  ON D.func\_id = F.id
     AND D.idade < 18
Enter fullscreen mode Exit fullscreen mode

Que gera o seguinte plano de execução:

plano de execução para left join

Concluindo, refaço a pergunta: Você comete este erro no Left Join?

Caso queria ver os exemplos na prática, acesse este link.

v.3.01

Top comments (0)