Cómo eliminar filas duplicadas en SQL Server, MySql y Oracle

En este articulo veremos cómo eliminar filas duplicadas en SQL Server, en MySQL y Oracle.


Cómo eliminar filas duplicadas en SQL Server

Suponiendo que no tienes valores nulos, agrupa las columnas exclusivas (por ejemplo, col_1, col_2, col_3) y seleccionas la columna identificadora (el ID) el MIN o MAX (por ejemplo, row_id) como la fila que se debe conservar. Luego, elimine todo lo que no tenía un ID:

DELETE my_table
FROM my_table
                LEFT OUTER JOIN (
                SELECT MIN(row_id) as row_id, col_1, col_2, col_3
                FROM my_table
                GROUP BY col_1, col_2, col_3
) as keep_rows ON
                my_table.row_id = keep_rows.row_id
WHERE
                keep_rows.row_id IS NULL

Si tiene un GUID en lugar de un entero como ID, utiliza lo siguiente.

CONVERT(uniqueidentifier, MIN(CONVERT(char(36), my_guid_column)))

Cómo eliminar filas duplicadas en MySQL

Continuando con el ejemplo anterior, imaginemos que tienes las columnas col_1, col_2 y col_3, para eliminar las filas repetidas utilizamos una tabla temporal.

create temporary table temp_table (id int);
insert  temp_table
        (id)
select  id
from    your_table t1
where   exists
        (
        select  *
        from    your_table t2
        where   t2.col_1 = t1.col_1
                and t2.col_2 = t1.col_2
                and t2.col_3 = t1.col_3
                and t2.id > t1.id
        );
delete
from    your_table
where   id in (select id from temp_table);

O puedes agregar un índice ÚNICO a la tabla. Cuando ejecutes esto, se eliminarán todas las filas duplicadas. Como beneficio adicional, los futuros INSERT que son duplicados fallarán. Y será mejor que haga una copia de seguridad antes de ejecutar esta declaración.

ALTER IGNORE TABLE your_table ADD UNIQUE INDEX idx_name (col_1, col_2, col_3);

Cómo eliminar filas duplicadas en Oracle

El siguiente ejemplo elimina todas las filas duplicadas y dejar solo una de ellas en Oracle

DELETE FROM my_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM my_table
GROUP BY column1, column2, column3...) ;
Artículos relacionados
0 Comentarios
Enviame un comentario