Re: borrar registros repetidos

From: WILLIAM PARRA <wilparra(at)yahoo(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: borrar registros repetidos
Date: 2006-09-22 21:20:33
Message-ID: 20060922212033.4505.qmail@web56611.mail.re3.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Esta es otra solucion para el caso de una tabla con n columnas

create table lugares_1
(
codigo_lugar numeric(10) not null primary key,
nombre_lugar varchar(70),
campo1 varchar(70),
campo2 varchar(70)
);
insert into lugares_1 values(1,'cucaita','cucaita','cucaita');
insert into lugares_1 values(2,'cucaita','cucaita','cucaita');
insert into lugares_1 values(3,'cucaita','cucaita','cucaita');
insert into lugares_1 values(4,'cucaita','cucaita','cucaita');
insert into lugares_1 values(5,'sora','sora','sora');
insert into lugares_1 values(6,'sora','sora','sora');
insert into lugares_1 values(7,'sora','sora','sora');
insert into lugares_1 values(8,'samaca','samaca','samaca');
insert into lugares_1 values(9,'samaca','samaca','samaca');
insert into lugares_1 values(10,'sachica','sachica','sachica');
-- En este script, sobral algunos datos repetidos, los cuales serian de los lugares cucaita, sora y samaca, pero hay que mantener por lo menos uno
/
delete from lugares_1 where codigo_lugar in (
select codigo_lugar from lugares_1 where (nombre_lugar,campo1,campo2) in
(
select nombre_lugar,campo1,campo2 from lugares_1 group by nombre_lugar,campo1,campo2 having count(*)>1
)
and codigo_lugar not in (
select min(codigo_lugar) from lugares_1
group by nombre_lugar
having count(*)>1
)
)
/
Este script borrará efectivamente los registros repetidos

WILLIAM PARRA <wilparra(at)yahoo(dot)com> escribió:
Esta es otra version a la solucion que incluye pa posibilidad de varios campos,
create table lugares_1
(
codigo_lugar numeric(10) not null primary key,
nombre_lugar varchar(70),
campo1 varchar(70),
campo2 varchar(70)
);

insert into lugares_1 values(1,'cucaita',,);
insert into lugares_1 values(2,'cucaita');
insert into lugares_1 values(3,'cucaita');
insert into lugares_1 values(4,'cucaita');
insert into lugares_1 values(5,'sora');
insert into lugares_1 values(6,'sora');
insert into lugares_1 values(7,'sora');
insert into lugares_1 values(8,'samaca');
insert into lugares_1 values(9,'samaca');
insert into lugares_1 values(10,'sachica');
-- En este script, sobral algunos datos repetidos, los cuales serian de los lugares cucaita, sora y samaca, pero hay que mantener por lo menos uno

delete from lugares_1 where codigo_lugar in (
select codigo_lugar from lugares_1 where (nombre_lugar, campo1,campo2) in
(
select nombre_lugar, campo1,campo2 from lugares_1 group by nombre_lugar having count(*)>1
)
and codigo_lugar not in (
select min(codigo_lugar) from lugares_1
group by nombre_lugar, campo1,campo2
having count(*)>1
)
);

Si corres este script, este es el resultado en la tabla de lugares_1

select * from lugares_1;

1 cucaita
5 sora
8 samaca
10 sachica

Funciona para este ejemplo.... para una tabla con mas columnas precisaria de concatenar los campos para hacer el in....
No sé que piensen ustedes si sea demasiado pesado....
En fin...

Saludos,

William Parra Alba
UPTC - Tunja - Colombia

Patricio Cifuentes Ithal <pcifuentes(at)siigsa(dot)cl> escribió:
Me sirvio de mucho... muchas gracias a todos....!!!!!
--

Patricio Cifuentes Ithal
Ingeniero en Informática

Desarrollo Tecnológico
SIIGSA
(56-2) 204 60 22
----- Original Message -----
From: "Juan MartÃ&shy;nez"
To: "Mario Gonzalez ( mario__ )" ; "lista postrges"

Sent: Friday, September 22, 2006 4:06 PM
Subject: Re: [pgsql-es-ayuda] borrar registros repetidos

> Mario Gonzalez ( mario__ ) escribió:
> > On 22/09/06, Juan MartÃ&shy;nez wrote:
> >>
> >> [...]
> >> Hacerlo todo en un solo SQL statement lo veo dificil.
> >
> > No Juan, Si se puede hacer mediante SQL, en realidad es muy facil.
> > Patricio, esas preguntas dan gusto, lo digo de verdad :-)
>
> Ops. Toda la razon. Me encegueci tratando de hacerlo solo con DELETE FROM.
>
> Ciertamente tu solucion es mas rapida (aun que no sea un solo SQL
> statement)...
>
> > CREATE TEMP TABLE personas_tmp AS SELECT distinct on (nombre)
> > id,nombre from personas;
>
> mmm...
>
> SELECT DISTINCT ON (nombre) id, nombre
> INTO personas_tmp
> FROM personas
> ORDER BY nombre, id;
>
> > DELETE FROM personas where personas.id != personas_tmp.id;
>
> DELETE FROM personas
> WHERE id NOT IN (SELECT id FROM personas_tmp);
>
> :-)
>
> Saludos
>
> --
> Juan Martinez G.
> Departamento de Informatica
> Universidad Miguel de Cervantes
>
> ---------------------------(fin del mensaje)---------------------------
> TIP 4: No hagas 'kill -9' a postmaster
>
> --
> Este mensaje ha sido analizado por MailScanner
> en busca de virus y otros contenidos peligrosos,
> y se considera que est limpio.
>
> www.siigsa.cl

--
Este mensaje ha sido analizado por MailScanner
en busca de virus y otros contenidos peligrosos,
y se considera que está limpio.

www.siigsa.cl

---------------------------(fin del mensaje)---------------------------
TIP 9: el optimizador ignorará el uso de recorridos de índice si los
tipos de datos de las columnas no coinciden

__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
Regístrate ya - http://correo.espanol.yahoo.com/

__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
Regístrate ya - http://correo.espanol.yahoo.com/

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Patricio Cifuentes Ithal 2006-09-22 21:43:51 Re: borrar registros repetidos
Previous Message Javier Aquino H. 2006-09-22 21:15:38 Re: borrar registros repetidos