CodePráticov3.3.0
SQL

LEFT JOIN duplicando registros: por que acontece e como corrigir

Entenda por que um LEFT JOIN multiplica linhas e veja formas seguras de corrigir usando agregação, EXISTS e critérios de relacionamento.

Por que o LEFT JOIN duplica linhas?

Um JOIN não cria duplicidade por acaso. Ele retorna uma linha para cada combinação encontrada. Se um cliente possui três telefones, juntar clientes com telefones produzirá três linhas para esse cliente.

SELECT c.id, c.nome, t.numero
FROM clientes c
LEFT JOIN telefones t
       ON t.cliente_id = c.id;

Se a sua expectativa era uma linha por cliente, o problema está na cardinalidade do relacionamento ou no resultado que você quer obter.

Quando você precisa de apenas um valor da tabela filha

Agregue a tabela filha antes do JOIN. Por exemplo, para obter a última data de contato:

SELECT c.id,
       c.nome,
       t.ultima_data
FROM clientes c
LEFT JOIN (
    SELECT cliente_id,
           MAX(data_contato) AS ultima_data
    FROM contatos
    GROUP BY cliente_id
) t ON t.cliente_id = c.id;

Quando você só precisa saber se existe

Se a tabela relacionada serve apenas como filtro, muitas vezes EXISTS representa melhor a regra e evita multiplicar resultados.

SELECT c.id, c.nome
FROM clientes c
WHERE EXISTS (
    SELECT 1
    FROM pedidos p
    WHERE p.cliente_id = c.id
);

DISTINCT resolve?

DISTINCT pode esconder linhas repetidas, mas não corrige um relacionamento incorreto. Use-o somente quando as linhas realmente forem equivalentes para o resultado desejado.

Regra prática: antes de usar DISTINCT, descubra qual tabela está retornando mais de uma linha para a chave do JOIN.