Ajude o site desativando o bloqueador de anúncio
Cabeçalho

Querie para dados duplicados da tabela

Autor: Eurai Criado: 16/02/2025 Atualizado: 11/11/2025 ADVPL
Postagem

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!

ASSINE A NEWSLETTER

Cadastrando...

PIX uDesenv

PIX QR Code para depósito

Clique para doar

Parceiros

Tudo em ADVPL - Blog parceiro

Blog ADVPL