Tengo una tabla de base de datos PostgreSQL llamada "user_links" que actualmente permite los siguientes campos duplicados:
year, user_id, sid, cid
La única limitación es actualmente el primer campo llamado "id", sin embargo ahora estoy buscando añadir una limitación para asegurarse de que el year
, user_id
, sid
y cid
son únicas, pero no puedo aplicar la restricción porque los valores duplicados ya existen, que violen esta restricción.
¿Hay alguna manera de encontrar todos los duplicados?
sql
postgresql
duplicates
Juan
fuente
fuente
Respuestas:
La idea básica será usar una consulta anidada con agregación de conteo:
Puede ajustar la cláusula where en la consulta interna para limitar la búsqueda.
Hay otra buena solución para eso mencionada en los comentarios (pero no todos los leen):
O más corto:
fuente
select co1, col2, count(*) from tbl group by col1, col2 HAVING count(*)>1
De " Buscar filas duplicadas con PostgreSQL " aquí hay una solución inteligente:
fuente
SELECT * FROM ( SELECT *, LEAD(row,1) OVER () AS nextrow FROM ( SELECT *, ROW_NUMBER() OVER(w) AS row FROM tbl WINDOW w AS (PARTITION BY col1, col2 ORDER BY col3) ) x ) y WHERE row > 1 OR nextrow > 1;
ROW_NUMBER()
conCOUNT(*)
y agreguerows between unbounded preceding and unbounded following
despuésORDER BY id asc
DELETE ...USING
y algunos ajustes menoresPuede unirse a la misma tabla en los campos que se duplicarían y luego unirse en el campo id. Seleccione el campo id del primer alias de la tabla (tn1) y luego use la función array_agg en el campo id del segundo alias de la tabla. Finalmente, para que la función array_agg funcione correctamente, agrupará los resultados por el campo tn1.id. Esto producirá un conjunto de resultados que contiene la identificación de un registro y una matriz de todas las identificaciones que se ajustan a las condiciones de unión.
Obviamente, los id que estarán en la matriz duplicate_entries para un id, también tendrán sus propias entradas en el conjunto de resultados. Tendrá que usar este conjunto de resultados para decidir qué identificación desea que se convierta en la fuente de la 'verdad'. El único registro que no debería eliminarse. Tal vez podrías hacer algo como esto:
Selecciona las ID de números más bajos que tienen duplicados (suponiendo que la ID está aumentando int PK). Estas serían las identificaciones que conservaría.
fuente
Para facilitarlo, supongo que desea aplicar una restricción única solo para el año de la columna y la clave principal es una columna llamada id.
Para encontrar valores duplicados que debe ejecutar,
Usando la instrucción sql anterior, obtienes una tabla que contiene todos los años duplicados en tu tabla. Para eliminar todos los duplicados, excepto la última entrada duplicada , debe usar la instrucción sql anterior.
fuente