Borrar registros duplicados usando SQL

Borrar registros duplicados usando SQL

 

El siguiente procedimento almacenado es un ejemplo o guía que te permitira eliminar registros duplicados de una tabla y dejando un registro (1) por cada duplicado. Te sugiero hacer primero un conteo de los registros que tienes y que realices una sumatoria de los registros duplicados que se obtiene del primer select.

 

Valor Duplicado1   5

Valor Duplicado2   5

Valor Duplicado3   5

Valor Duplicado4   4

Valor Duplicado5   4

Valor Duplicado6   3

 

Por ejemplo el total de la sumatoria es 26 a este valor le restamos la cantidad de  valores duplicados que es 6.

 

El total de registros duplicados a eliminar es 20. Y con un select del total de filas de la tabla le restas 20 y este sera el total de filas que deberas tener al final de jecutar el siguiente procedimiento almacenado. 

 

 

/********************************************************************************************************

* Elaborado Por     :   Omar Acosta                                                      *

* Acción            :   Eliminar duplicados de una tabla con sql server 2000 o 2005     *

* Fecha Creación    :   2009/10/14                                                                      *

*********************************************************************************************************/

CREATE PROCEDURE [dbo].[Duplicados]

AS

–INICIALIZAMOS LA TRANSACCION

BEGIN TRANSACTION

 

DECLARE @VALORDUPLICADO VARCHAR(20)

DECLARE @NUMVECESDUPLICADO INT

            –Se declara el cursor principal que obtiene el valor

                  –del campo duplicado y el numero de veces que se repite

            DECLARE CURSOR_DUPLICADOS CURSOR FOR

 

                  –usted debe reemplazar el nombre de la tabla y el nombre del

                  –campo por el cual va a eliminar este ejemplo lo realize con la tabla GIFCONSUMO

                  SELECT     VEHPLACA AS ValorDuplicado, COUNT(1) AS NumVecesDuplicado

                  FROM         GIFCONSUMO

                  GROUP BY VEHPLACA

                  HAVING      (COUNT(1) > 1)

                  ORDER BY NumVecesDuplicado

 

            –Recorre el cursor

            OPEN CURSOR_DUPLICADOS

            FETCH NEXT FROM CURSOR_DUPLICADOS

            INTO @VALORDUPLICADO,@NUMVECESDUPLICADO 

                 

            WHILE @@FETCH_STATUS = 0

            BEGIN      

                                   –para controlar que no se borren todos los registros

                                   –y se mantenga un valor en la tabla

                                   DECLARE @CONTADOR INT  

                                   SET @CONTADOR =1

                                   – el tipo de dato depende del valor definido para la tabla

                                   DECLARE @ID NUMERIC(18,0)                          

                                   –se elimina el registro(s) duplicados pero se deja uno solo.

                                   DECLARE CURSOR_BORRARDUPLICADOS CURSOR FOR

                                   –se consulta los id de los valores duplicados

                                   SELECT     CONID AS ID

                                   FROM         GIFCONSUMO                             

                                   WHERE VEHPLACA = @VALORDUPLICADO                                

                                   –Recorre el cursor de boorado de registros

                                   OPEN CURSOR_BORRARDUPLICADOS

                                   FETCH NEXT FROM CURSOR_BORRARDUPLICADOS

                                   INTO @ID

 

                                   WHILE @@FETCH_STATUS = 0

                                   BEGIN

                                         –ELIMINAMOS LOS REGISTROS DUPLICADOS

                                         –MENOS EL ULTIMO REGISTRO

                                         IF(@CONTADOR < @NUMVECESDUPLICADO)

                                             DELETE GIFCONSUMO WHERE CONID= @ID

                                         –aumentamos el contador para controloar no borrar

                                         –el ultimo registro

                                  SET @CONTADOR = @CONTADOR + 1

                                         FETCH NEXT FROM CURSOR_BORRARDUPLICADOS

                                         INTO @ID

                                   END

                                   –cierro y libero el cursor interno

                                   CLOSE CURSOR_BORRARDUPLICADOS

                                   DEALLOCATE CURSOR_BORRARDUPLICADOS

                        –cierro y libero el cursor principal

                        FETCH NEXT FROM CURSOR_DUPLICADOS

                        INTO @VALORDUPLICADO,@NUMVECESDUPLICADO

            END

            CLOSE CURSOR_DUPLICADOS

            DEALLOCATE CURSOR_DUPLICADOS

–ingresa por este lado si ocurre error o al finalizar el proceso               

IF @@ERROR <> 0

BEGIN

    ROLLBACK TRANSACTION

    RETURN -1

END

    COMMIT TRANSACTION

 

 

 

 

 

 

About these ads

About omaracostacasas

ING SOFTWARE
This entry was posted in SQL Server. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s