Muitas vezes, faz necessário eliminar informações duplicadas, existe algumas formas de realizar essa tarefa. Abaixo segue uma forma de fazer.
Explicação rápida, ele conta o total de duplicados, deixando sempre 1 (TOP(@CONT -1)).
Esse script foi testando no MSSQL 2008, 2012 e 2014.
Explicação rápida, ele conta o total de duplicados, deixando sempre 1 (TOP(@CONT -1)).
Esse script foi testando no MSSQL 2008, 2012 e 2014.
DECLARE @ID VARCHAR(500)
DECLARE @CONT int
DECLARE CUR_DELETE CURSOR FOR
SELECT N4_FILIAL+N4_CBASE+N4_ITEM+N4_TIPO+N4_OCORR+N4_TIPOCNT+N4_CONTA+N4_DATA+N4_SEQREAV, COUNT(*)
FROM SN4010
WHERE D_E_L_E_T_ = ' '
AND N4_FILIAL = '01'
--AND N4_ITEM = '07'
AND N4_CBASE = 'BR0016 '
AND N4_DATA = '20100831'
GROUP BY N4_FILIAL+N4_CBASE+N4_ITEM+N4_TIPO+N4_OCORR+N4_TIPOCNT+N4_CONTA+N4_DATA+N4_SEQREAV
HAVING COUNT(*) > 1
OPEN CUR_DELETE
FETCH NEXT FROM CUR_DELETE INTO @ID,@CONT
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE TOP(@CONT -1) SN4010 SET D_E_L_E_T_ = '*'
WHERE N4_FILIAL+N4_CBASE+N4_ITEM+N4_TIPO+N4_OCORR+N4_TIPOCNT+N4_CONTA+N4_DATA+N4_SEQREAV = @ID
FETCH NEXT FROM CUR_DELETE INTO @ID,@CONT
END
CLOSE CUR_DELETE
DEALLOCATE CUR_DELETE
/*
VERIFICA OS REGISTROS QUE FORAM ALTERADOS
*/
SELECT N4_FILIAL, N4_CBASE, N4_ITEM, N4_TIPO, N4_OCORR, N4_MOTIVO, N4_TIPOCNT, N4_CONTA, N4_DATA, N4_VLROC1,N4_SEQREAV,count(*)
FROM SN4010
WHERE D_E_L_E_T_ = ' '
AND N4_FILIAL = '01'
--AND N4_ITEM = '07'
AND N4_CBASE = 'BR0016 '
AND N4_DATA = '20100831'
GROUP BY N4_FILIAL, N4_CBASE, N4_ITEM, N4_TIPO, N4_OCORR, N4_MOTIVO, N4_TIPOCNT, N4_CONTA, N4_DATA, N4_VLROC1,N4_SEQREAV
HAVING COUNT(*) > 1