Silent data loss: como um INNER JOIN come seus dados sem avisar
· SQL, JOIN, qualidade de dados
Em resumo: um INNER JOIN só mantém as linhas que casam dos dois lados. Quando a chave
de junção tem furos (nulos, formatos diferentes, registros sem correspondência), ele
descarta linhas em silêncio, e o relatório sai com menos dado, sem nenhum aviso. É uma
das causas mais comuns de número que "encolheu sem explicação".
Por que o erro é silencioso
INNER JOIN faz exatamente o que promete: devolve só o que casa. O problema é que "o que não
casa" some sem reclamar. Se 5% das chaves não batem, você perde 5% dos registros e o total
ainda parece plausível. Ninguém vê, até alguém conferir contra a fonte.
Quando isso acontece de verdade
- Chave com formato diferente entre as tabelas (espaço, zero à esquerda, maiúscula/minúscula).
- Nulos na chave: não casam com nada.
- Cadastro incompleto: um pedido sem cliente correspondente é descartado.
- Granularidade errada: junção que multiplica linhas (o oposto: dado a mais).
Como detectar e se proteger
- Conte antes e depois do join. Se o número de linhas caiu, investigue por quê.
- Compare totais por camada: origem vs. resultado (mesma lógica de achar a diferença no fechamento).
- Use LEFT JOIN + verificação quando quiser manter tudo e tratar o que não casou.
- Valide a chave (formato, nulos) antes da junção, parte de um pipeline confiável.
O ponto não é "nunca usar INNER JOIN". É saber o que ele descarta e validar isso de propósito. Faço esse tipo de blindagem em pipelines ETL/ELT. Se um número encolheu sem explicação, eu ajudo a achar onde ele sumiu.
É exatamente isso que faço em Pipeline de dados que quebra alto e cedo — nunca em silêncio.
Leia também
Um caso de dados por mês
Histórias reais do que quebra um pipeline e um fechamento — e como resolver. Sem spam, cancele quando quiser.