This content originally appeared on DEV Community and was authored by Airton Carneiro
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
This content originally appeared on DEV Community and was authored by Airton Carneiro

Airton Carneiro | Sciencx (2024-07-13T13:41:20+00:00) Você comete este erro no Left Join?. Retrieved from https://www.scien.cx/2024/07/13/voce-comete-este-erro-no-left-join/
Please log in to upload a file.
There are no updates yet.
Click the Upload button above to add an update.