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
Top comments (0)