JOINs são a base do SQL relacional, mas também a fonte de muitos bugs. Aqui estão os 5 erros mais comuns e como evitá-los.
1. INNER JOIN quando deveria ser LEFT JOIN
Se você quer todos os clientes, mesmo os sem pedidos, use LEFT JOIN:
-- Errado: perde clientes sem pedidos
SELECT c.nome, p.valor
FROM clientes c
INNER JOIN pedidos p ON p.cliente_id = c.id
-- Correto: mantém todos os clientes
SELECT c.nome, COALESCE(p.valor, 0) AS valor
FROM clientes c
LEFT JOIN pedidos p ON p.cliente_id = c.id
2. Condição no WHERE em vez de ON (com LEFT JOIN)
-- Errado: transforma LEFT JOIN em INNER JOIN
SELECT c.nome, p.valor
FROM clientes c
LEFT JOIN pedidos p ON p.cliente_id = c.id
WHERE p.data_pedido >= CURRENT_DATE - 30
-- Correto: condição no ON
SELECT c.nome, p.valor
FROM clientes c
LEFT JOIN pedidos p ON p.cliente_id = c.id AND p.data_pedido >= CURRENT_DATE - 30
3. JOIN sem condição (produto cartesiano)
-- CUIDADO: retorna N×M linhas!
SELECT c.nome, p.valor
FROM clientes c, pedidos p
4. Usar SELECT * em JOINs
-- Errado: retorna colunas duplicadas
SELECT * FROM clientes c JOIN pedidos p ON p.cliente_id = c.id
-- Correto: selecione colunas específicas
SELECT c.nome, p.valor, p.data_pedido
FROM clientes c JOIN pedidos p ON p.cliente_id = c.id
5. Esquecer de indexar chaves estrangeiras
-- Crie índice na FK para performance
CREATE INDEX idx_pedidos_cliente ON pedidos(cliente_id);
Montar JOINs complexos pode ser difícil. Descreva o que você quer em português e o Sqlify gera a query com os JOINs corretos.
Conclusão
JOINs são poderosos mas exigem atenção. Sempre use ON para as condições de junção, WHERE para filtros, e índices nas chaves estrangeiras.