Depure JOINs SQL prevendo a cardinalidade primeiro
Um JOIN fica mais fácil de diagnosticar quando você define quantas correspondências cada linha pode produzir.
DoesItHold Editorial · · revisado em · guide-sql-joins-001
Resposta direta
Declare a relação, verifique a unicidade das chaves e deixe cada predicado necessário explícito no ON.
Um JOIN retorna uma linha para cada par correspondente. Se uma chave de cliente aparecer duas vezes, um pedido pode virar duas linhas mesmo com SQL sintaticamente válido. Se faltar um predicado de empresa ou versão, o multiplicador pode ser muito maior.
Antes de editar a consulta, descreva a relação: um cliente por pedido, zero ou um perfil ativo por conta, ou muitos itens por fatura. Essa expectativa transforma uma contagem inexplicada em um teste com limites claros.
- 01Pedidos2 linhas referenciam o cliente 7
- 02Clientesid 7 existe em duas empresas
- 03JOIN incompleto2 × 2 pares = 4 linhas
- 04Chave completaempresa + id restauram 2 linhas
Exemplo mínimo
Região de código com rolagem
SELECT o.id, c.name
FROM orders AS o
JOIN customers AS c
ON c.id = o.customer_id;SELECT o.id, c.name
FROM orders AS o
JOIN customers AS c
ON c.id = o.customer_id
AND c.tenant_id = o.tenant_id;O que muda: O predicado adicional expressa a relação composta real; DISTINCT deixa de ser necessário porque os pares incorretos nem chegam a ser produzidos.
Método de depuração
Conte as entradas, teste a unicidade, estime correspondências por linha e compare com a contagem do JOIN.
- Conte as linhas de cada entrada com os mesmos filtros da consulta final.
- Agrupe as chaves candidatas e inspecione qualquer contagem maior que um.
- Escolha uma chave duplicada na saída e rastreie cada par que a produziu.
- Adicione o predicado ausente ou imponha a unicidade exigida pelo modelo e conte novamente.
Correção incorreta comum
DISTINCT pode apagar duplicatas visíveis e manter uma relação incorreta e trabalho desnecessário. Agrupar por todas as colunas selecionadas produz o mesmo tipo de disfarce.
Limites e casos especiais
Um resultado maior está correto em relações de um para muitos ou muitos para muitos. Junções externas também preservam linhas sem correspondência e introduzem colunas nulas. O objetivo não é reduzir a contagem, mas fazê-la concordar com a relação declarada.