Como excluir registros de uma tabela baseando-se em outra tabela?

Podemos excluir registros de uma tabela baseando-se em outra utilizando DELETE com JOIN, NOT EXISTS ou NOT IN no SQL.

Como excluir registros de uma tabela baseando-se em outra tabela?

Em algumas situações, precisamos remover registros de uma tabela que possuem ou não correspondência em outra tabela. Isso pode ser útil, por exemplo, para apagar clientes inativos, pedidos cancelados, ou dados temporários.

Excluindo com DELETE e JOIN (MySQL, SQL Server)

O método mais eficiente para excluir registros baseando-se em outra tabela é utilizando DELETE com JOIN:

DELETE c 
FROM clientes c 
LEFT JOIN pedidos p ON c.id = p.cliente_id 
WHERE p.id IS NULL;

Essa consulta remove todos os clientes que não possuem pedidos.

Excluindo com DELETE e NOT EXISTS (PostgreSQL, SQL Server, Oracle)

Se o banco de dados não suportar DELETE ... JOIN, podemos usar NOT EXISTS:

DELETE FROM clientes 
WHERE NOT EXISTS (
    SELECT 1 FROM pedidos WHERE pedidos.cliente_id = clientes.id
);

Isso exclui os clientes que não possuem pedidos.

Excluindo com DELETE e NOT IN

Outra abordagem é utilizar NOT IN, mas pode ser menos eficiente:

DELETE FROM clientes 
WHERE id NOT IN (SELECT cliente_id FROM pedidos);

Isso também remove os clientes sem pedidos, mas pode ser lento se houver muitos registros.

Comparação de Métodos

Método Melhor para
DELETE + JOIN Melhor desempenho em bases grandes com índices
DELETE + NOT EXISTS Alternativa eficiente e segura em todos os bancos
DELETE + NOT IN Pode ser mais lento e problemático com valores NULL

Cuidados ao excluir registros

  • Sempre faça um SELECT antes de um DELETE para conferir os registros afetados.
  • Certifique-se de que a coluna usada no filtro está indexada para evitar quedas de performance.
  • Evite excluir registros sem necessidade, especialmente em bancos transacionais que mantêm histórico de dados.

A exclusão de registros no SQL baseada em outra tabela é um procedimento essencial para manter bases de dados organizadas e evitar registros desnecessários. Em sistemas de CRM, por exemplo, é comum excluir clientes que não interagem há muito tempo. Já em e-commerces, remover produtos descontinuados pode otimizar o banco de dados. No entanto, é fundamental garantir que as regras de negócio estejam bem definidas para evitar a remoção de dados importantes.

Algumas aplicações:

  • Remover clientes sem pedidos registrados
  • Excluir produtos que nunca foram vendidos
  • Eliminar funcionários inativos do sistema
  • Apagar registros temporários ou duplicados
  • Excluir contas que não foram ativadas após um período

Dicas para quem está começando

  • Sempre teste com SELECT antes de executar um DELETE
  • Se possível, prefira DELETE com JOIN para melhor performance
  • Verifique a necessidade de backups antes de deletar dados
  • Evite NOT IN em bases grandes, pois pode ser menos eficiente
  • Use índices para garantir que as consultas sejam rápidas

Contribuições de Fernando Albuquerque

Compartilhe este tutorial: Como excluir registros de uma tabela baseando-se em outra tabela?

Compartilhe este tutorial

Continue aprendendo:

Como buscar registros que existem em uma tabela, mas não em outra?

Podemos encontrar registros presentes em uma tabela, mas não em outra, utilizando LEFT JOIN, NOT EXISTS ou NOT IN.

Tutorial anterior

Como unir os resultados de duas consultas SQL?

Podemos unir resultados de duas consultas SQL utilizando UNION para remover duplicatas ou UNION ALL para incluir todos os registros.

Próximo tutorial