jueves, 28 de julio de 2011

Eliminar duplicados en SQL SERVER

Para eliminar filas duplicadas en SQL SERVER, podemos seguir estos pasos:

  1. Crear una tabla que contenga las columnas clave y la cantidad de registros
    duplicados.

  2. Crear una tabla que contenga las filas distintas sin repetir

  3. Eliminar la totalidad de filas duplicadas de la tabla original

  4. Insertar las filas distintas de la tabla creada

Comenzemos creando una tabla e insertandole registros:



CREATE TABLE Prueba
(
Folio int,
Descripcion varchar(50)
)

INSERT INTO Prueba VALUES
(1,'Prueba'),(1,'Prueba'),(1,'Prueba'),
(2,'Otra prueba'),(3,'Otra prueba mas'),
(4,'Otra prueba x'),(5,'Otra prueba y')


Si seleccionamos todas la filas de la tabla mediante: SELECT * FROM Prueba
Obtenemos:

Folio Descripcion
----------- ------------------------------
1 Prueba
1 Prueba
1 Prueba
2 Otra prueba
3 Otra prueba mas
4 Otra prueba x
5 Otra prueba y

(7 row(s) affected)

Son tres filas las repetidas. Vamos a insertarlas en una tabla temporal, agrupadas por la clave, que en este caso es la columna "Folio" (Este ejemplo es sencillo y se utiliza una sola columna, pero pueden ser N columnas, dependiendo de cada caso)

SELECT Folio, COUNT(*) Cant
INTO #TempK
FROM Prueba
GROUP BY Folio
HAVING COUNT(*) > 1


Si seleccionamos las filas de la tabla temporal #TempK obtenemos:

Folio Cant
----------- -----------
1 3
(1 row(s) affected)

Ahora proseguimos a realizar una instrucción "SELECT DISTINCT INTO" para crear
una tabla con las filas distintas, sin duplicados:

SELECT DISTINCT P.Folio, P.Descripcion
INTO #TempC
FROM Prueba P, #TempK T
WHERE P.Folio = T.Folio


Si seleccionamos todas las filas en #TempC tenemos:

Folio Descripcion
----------- ------------------------------
1 Prueba
(1 row(s) affected)

Ya tenemos las filas sin duplicados. Ahora bien, procedemos a eliminar las filas
duplicadas en la tabla original:

DELETE Prueba
FROM Prueba P, #TempK T
WHERE P.Folio = T.Folio


Y ha insertar las filas distintas, sin duplicar:

INSERT Prueba
SELECT *
FROM #TempC


Ahora, seleccionamos todas las filas de la columna original:

SELECT * FROM Prueba


Y tenemos:

Folio Descripcion
----------- ------------------------------
1 Prueba
2 Otra prueba
3 Otra prueba mas
4 Otra prueba x
5 Otra prueba y
(5 row(s) affected)

La tabla sin duplicados. ¿Simple no?

No hay comentarios:

Publicar un comentario