validar una tabla repetidos quitar omitir eliminar duplicidad duplicados duplicado consulta como buscar sql postgresql

sql - repetidos - Eliminar duplicados de una tabla



sql omitir repetidos (7)

Al usar TSQL, no hay idea de si Postgres admite tablas temporales, pero puede seleccionar una tabla temporal, y luego recorrer y eliminar e insertar sus resultados nuevamente en el original

-- **Disclaimer** using TSQL -- You could select your records into a temp table with a pk Create Table #dupes ([id] int not null identity(1,1), f1 int, f2 int, f3 int) Insert Into #dupes (f1,f2,f3) values (1,2,3) Insert Into #dupes (f1,f2,f3) values (1,2,3) Insert Into #dupes (f1,f2,f3) values (1,2,3) Insert Into #dupes (f1,f2,f3) values (2,3,4) Insert Into #dupes (f1,f2,f3) values (4,5,6) Insert Into #dupes (f1,f2,f3) values (4,5,6) Insert Into #dupes (f1,f2,f3) values (4,5,6) Insert Into #dupes (f1,f2,f3) values (7,8,9) Select f1,f2,f3 From #dupes Declare @rowCount int Declare @counter int Set @counter = 1 Set @rowCount = (Select Count([id]) from #dupes) while (@counter < @rowCount + 1) Begin Delete From #dupes Where [Id] <> (Select [id] From #dupes where [id]=@counter) and ( [f1] = (Select [f1] from #dupes where [id]=@counter) and [f2] = (Select [f2] from #dupes where [id]=@counter) and [f3] = (Select [f3] from #dupes where [id]=@counter) ) Set @counter = @counter + 1 End Select f1,f2,f3 From #dupes -- You could take these results and pump them back into --your original table Drop Table #dupes

Probado esto en MS SQL Server 2000. No estoy familiarizado con las opciones de Postgres, pero tal vez esto te lleve en la dirección correcta.

El tipo de base de datos es PostGres 8.3.

Si escribo:

SELECT field1, field2, field3, count(*) FROM table1 GROUP BY field1, field2, field3 having count(*) > 1;

Tengo algunas filas que tienen un recuento de más de 1. ¿Cómo puedo sacar el duplicado (todavía quiero 1 fila para cada uno de ellos en lugar de +1 fila ... No quiero borrarlos todos).

Ejemplo:

1-2-3 1-2-3 1-2-3 2-3-4 4-5-6

Debe convertirse :

1-2-3 2-3-4 4-5-6

La única respuesta que encontré está allí, pero me pregunto si podría hacerlo sin la columna hash.

Advertencia : No tengo un PK con un número único, así que no puedo usar la técnica de min (...). El PK es los 3 campos.


Bueno, debería malinterpretar algo, pero diré:

SELECCIONE DISTINCT field1, field2, field3 FROM table1

¿Demasiado fácil ser bueno? ^^


Esta es una de las muchas razones por las que todas las tablas deben tener una clave principal (no necesariamente un número de ID o IDENTIDAD, sino una combinación de una o más columnas que identifica de manera única una fila y cuya singularidad se aplica en la base de datos).

Tu mejor apuesta es algo como esto:

SELECT field1, field2, field3, count(*) INTO temp_table1 FROM table1 GROUP BY field1, field2, field3 having count(*) > 1 DELETE T1 FROM table1 T1 INNER JOIN (SELECT field1, field2, field3 FROM table1 GROUP BY field1, field2, field3 having count(*) > 1) SQ ON SQ.field1 = T1.field1 AND SQ.field2 = T1.field2 AND SQ.field3 = T1.field3 INSERT INTO table1 (field1, field2, field3) SELECT field1, field2, field3 FROM temp_table1 DROP TABLE temp_table1


Este es el método más simple que he encontrado:

Sintaxis SQL Postgre:

CREATE TABLE tmp AS SELECT distinct * FROM table1 truncate table table1 insert into table1 select * from tmp drop table tmp

Sintaxis T-SQL:

select distinct * into #tmp from table1 truncate table table1 insert into table1 select * from #tmp drop table #tmp


Esto usará el ID del objeto OID (si la tabla se creó con él):

DELETE FROM table1 WHERE OID NOT IN (SELECT MIN (OID) FROM table1 GROUP BY field1, field2, field3)


Una buena respuesta para este problema, pero para SQL Server. Utiliza el ROWCOUNT que SQL Server ofrece, con buenos resultados. Nunca utilicé PostgreSQL y, por lo tanto, no conozco el equivalente de ROWCOUNT en PostgreSQL.


Una posible respuesta es:

CREATE <temporary table> (<correct structure for table being cleaned>); BEGIN WORK; -- if needed INSERT INTO <temporary table> SELECT DISTINCT * FROM <source table>; DELETE FROM <source table> INSERT INTO <source table> SELECT * FROM <temporary table>; COMMIT WORK; -- needed DROP <temporary table>;

No estoy seguro de si el ''trabajo'' es necesario en las declaraciones de transacción, ni si el BEGIN explícito es necesario en PostgreSQL. Pero el concepto se aplica a cualquier DBMS.

Lo único que debe tenerse en cuenta son las restricciones referenciales y, en particular, las operaciones de eliminación activadas. Si existen, esto puede resultar menos satisfactorio.