Você comete este erro no Left Join?
Airton Carneiro
Posted on July 13, 2024
Você comete este erro no Left Join?
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:
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
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:
Como percebido, temos o funcionário José Bonifácio na lista e o Pe. José de Anchieta, não. O resultado esperado seria:
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:
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
Que gera o seguinte plano de execução:
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
Posted on July 13, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
November 30, 2024
November 30, 2024