Conceito e mecanismo
Um join combina linhas segundo uma condição. INNER JOIN exige correspondência; LEFT JOIN preserva o lado esquerdo e apresenta NULL nas colunas do lado sem correspondência. Um filtro no ON escolhe correspondências, enquanto um WHERE posterior pode eliminar linhas preservadas. Relações um-para-muitos alteram cardinalidade: uma posição com dois contactos e três tags pode surgir seis vezes quando ambos os detalhes são combinados. Antes de somar, define a granularidade de cada conjunto e agrega ou separa relações quando necessário. SUM DISTINCT não é uma correção universal, porque posições diferentes podem ter montantes iguais. Self-joins e non-equijoins precisam do mesmo cuidado com chaves, aliases e multiplicidade.
Aplicação guiada
Num relatório fictício, começa por contar linhas e chaves de negócio antes e depois de cada join. Para fundos sem movimentos, COUNT(*) conta a linha preservada, mas COUNT(m.id), sendo id uma chave não nula, conta zero correspondências. Funções de grupo normalmente ignoram NULL na expressão: AVG de 10, NULL e 20 é 15; substituir o NULL por zero muda o resultado para 10. Usa WHERE para selecionar movimentos antes do agrupamento e HAVING para filtrar os grupos calculados. Documenta a diferença entre nenhum movimento, montante desconhecido e soma igual a zero. Estes estados podem exigir respostas operacionais distintas mesmo quando a apresentação tenta mostrá-los da mesma forma.
SELECT f.id, COUNT(m.id) FROM funds f LEFT JOIN movements m ON m.fund_id=f.id AND m.status='FAILED' GROUP BY f.id;
Armadilhas comuns
Filtro no WHERE a eliminar preservação; duas relações de detalhe como uma só; COUNT(*) como contagem de filhos.
Tópicos relacionados: Modelo, SELECT e população do resultado · Funções, conversões e contratos de dados · Subqueries, conjuntos e top-N
Prova a cardinalidade antes de confiar numa soma ou percentagem.
Referência: Join preservation and multiplicity · 1Z0-071 public objectives inspected 2026-09-30; revision date not published