Caderno de campo DoesItHold

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.

Rastreie a falha
  1. 01
    Pedidos2 linhas referenciam o cliente 7
  2. 02
    Clientesid 7 existe em duas empresas
  3. 03
    JOIN incompleto2 × 2 pares = 4 linhas
  4. 04
    Chave completaempresa + id restauram 2 linhas
Um JOIN emite pares correspondentes. Quando id é único apenas dentro de uma empresa, omitir tenant_id transforma uma correspondência pretendida em vários pares aparentemente válidos.

Exemplo mínimo

Região de código com rolagem

Com defeito
SELECT o.id, c.name
FROM orders AS o
JOIN customers AS c
  ON c.id = o.customer_id;
Corrigido
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.

  1. Conte as linhas de cada entrada com os mesmos filtros da consulta final.
  2. Agrupe as chaves candidatas e inspecione qualquer contagem maior que um.
  3. Escolha uma chave duplicada na saída e rastreie cada par que a produziu.
  4. 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.

Fontes