es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminar filas duplicadas pero conservar una sin tener una columna única.

Pregunta

Tengo una tabla con entradas duplicadas que quiero eliminar, manteniendo sólo una de las entradas duplicadas. Como puedes ver, son exactamente iguales en cada columna, no hay manera de diferenciarlas:

entrar la descripción de la imagen aquí

He utilizado esta consulta para averiguar cuántas entradas duplicadas tengo:

sql
select url_rewrite_id, category_id, product_id, count(*) cnt
from catalog_url_rewrite_product_category
group by url_rewrite_id, category_id, product_id
having cnt > 1
order by cnt desc

Podría usar una variante de esto para eliminar todas las entradas duplicadas:

sql
delete
from catalog_url_rewrite_product_category
where url_rewrite_id in (
select url_rewrite_id
from catalog_url_rewrite_product_category
group by url_rewrite_id, category_id, product_id
having count(*) > 1
)

El problema que tengo con esto es que eliminaría todas las entradas que son duplicadas y no mantendría la última.

Preguntas anteriores (aquí y aquí) asumen una columna de id única de alguna manera que no es el caso con la estructura de datos que tengo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    ¿Existe alguna forma de mantener la última entrada de los duplicados y eliminar el resto?

    Sí, puedes utilizar la siguiente consulta para mantener la última entrada de los duplicados y eliminar el resto:

    delete from catalog_url_rewrite_product_category
    where url_rewrite_id in (
        select url_rewrite_id
        from (
            select url_rewrite_id, max(id) as max_id
            from catalog_url_rewrite_product_category
            group by url_rewrite_id, category_id, product_id
            having count(*) > 1
        ) as t
        inner join catalog_url_rewrite_product_category as c
        on t.url_rewrite_id = c.url_rewrite_id
        and t.max_id != c.id
    )
    

Comments are closed.