Como Encontrar e Tratar Dados Duplicados no Banco de Dados (SQL)
Você já se deparou com registros duplicados em suas tabelas SQL? 🤔 Essas duplicidades podem causar inconsistências, erros em relatórios e até falhas em integrações. Neste artigo, você verá exemplos práticos de queries SQL para identificar e remover registros duplicados em tabelas como SPED050, SP8010 e DA1010.
🔍 Exemplo 1 — Encontrando duplicados por campo específico
SELECT NFE_PROT, COUNT(*) AS QTD
FROM SPED050 SPED
GROUP BY NFE_PROT
HAVING COUNT(NFE_PROT) > 1;
Essa query retorna todos os valores de NFE_PROT que aparecem mais de uma vez na tabela SPED050.
📋 Exemplo 2 — Listando os registros duplicados completos
SELECT *
FROM SPED050 SPED
WHERE EXISTS (
SELECT COUNT(NFE_PROT)
FROM SPED050
WHERE NFE_PROT = SPED.NFE_PROT
AND NFE_PROT != ''
GROUP BY NFE_PROT
HAVING COUNT(NFE_PROT) > 1
)
AND NFE_PROT != ''
AND STATUS = 6;
Essa variação mostra os registros completos duplicados e com STATUS = 6.
🧩 Exemplo 3 — Verificando duplicados em múltiplos campos
SELECT *
FROM SP8010 SP8
WHERE EXISTS (
SELECT COUNT(P8_FILIAL)
FROM SP8010 SP8_SUB
WHERE SP8_SUB.P8_FILIAL = SP8.P8_FILIAL
AND SP8_SUB.P8_MAT = SP8.P8_MAT
AND SP8_SUB.P8_DATA = SP8.P8_DATA
AND SP8_SUB.P8_TPMARCA = SP8.P8_TPMARCA
GROUP BY P8_FILIAL
HAVING COUNT(P8_FILIAL) > 1
)
AND SP8.D_E_L_E_T_ = '';
Ideal para identificar duplicações em conjuntos de colunas compostas.
⚙️ Exemplo 4 — Duplicados em tabelas de produtos (DA1010)
SELECT *
FROM DA1010 DA1
WHERE EXISTS (
SELECT COUNT(DA1_FILIAL)
FROM DA1010 DA1_SUB
WHERE DA1_SUB.DA1_FILIAL = DA1.DA1_FILIAL
AND DA1_SUB.DA1_CODTAB = DA1.DA1_CODTAB
AND DA1_SUB.DA1_CODPRO = DA1.DA1_CODPRO
AND DA1_SUB.D_E_L_E_T_ = ''
GROUP BY DA1_CODPRO
HAVING COUNT(DA1_CODPRO) > 1
)
AND DA1.D_E_L_E_T_ = '';
Essa query busca duplicatas de produtos baseadas em código e filial, ignorando registros marcados como excluídos.
🧹 Exemplo 5 — Removendo duplicados automaticamente com CTE
WITH Duplicatas AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY P8_FILIAL, P8_MAT, P8_DATA, P8_TPMARCA
ORDER BY R_E_C_N_O_
) AS rn
FROM SP8010
WHERE D_E_L_E_T_ = ''
)
UPDATE Duplicatas
SET D_E_L_E_T_ = '*'
WHERE rn > 1;
Usando uma CTE (Common Table Expression), você marca as duplicatas com * no campo D_E_L_E_T_, preservando o registro original.
💡 Dica extra
Antes de remover duplicados, sempre faça um backup ou execute a consulta em um ambiente de testes. Assim você evita a exclusão acidental de dados válidos.
Gostou do conteúdo? 😎 Compartilhe com seus colegas de trabalho e deixe um comentário abaixo! Até a próxima!