Aprendemos que devemos fazer os filtros após a cláusula where, mas quando tratamos com joins às vezes temos resultados diferentes quando usamos uma condição(filtro) na cláusa where ou no proprio join, por exemplo tenho uma tabela chamada municipio com os campos municipio_id e populacao e uma tabela relatório com os campos relatorio_id, municipio_id e ano. A query é a seguinte eu quero trazer todos os municipios com a informação se o relatório referente ao ano de 2019 já foi feito:
select m.municipio_id,r.relatorio_id from municipio m left join relatorio r on m.municipio_id = r.municipio_id where r.ano= 2019
O resultado da query não foi o esperado, me trouxe apenas os municipios que não continham o relatorio_id nulo. Porém obtive o resultado esperado quando fiz:
select m.municipio_id,r.relatorio_id from municipio m left join relatorio r on m.municipio_id = r.municipio_id and r.ano= 2019
e mais, se eu quiser agora aplicar um outro filtro por população por exemplo
select m.municipio_id,r.relatorio_id from municipio m left join relatorio r on m.municipio_id = r.municipio_id and r.ano= 2019 where m.populacao > 100000
Gostaria de saber qual a real diferença entre usar os filtros na cláusula where ou diretamente no join, e em que situação é recomendado usar um ou outro