From: | Gabriel Hermes Colina Zambra <hermeszambra(at)yahoo(dot)com> |
---|---|
To: | mcassan(at)speedy(dot)com(dot)ar |
Cc: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Busqueda de duplicados, con demora. |
Date: | 2007-06-02 21:28:49 |
Message-ID: | 642024.51551.qm@web63712.mail.re1.yahoo.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
--- Mario Cassanelli <mcassan(at)speedy(dot)com(dot)ar> escribió:
> Hola, hoy estoy con ganas de escribir en la lista,
> lo he hecho muy poco,
> pero como ya estoy trabajando con postgres, intento
> intercambiar y
> aprender,
>
> bueno una de las cosas que no haria es ordernar la
> tabla,
> para no trabajar mas -chapuceria- hacer un indice
> unico con unique
>
> otra que se me ocurre es hacer una tabla que no
> contenga lo duplicados
> que es lo que me parece estas haciendo,
No justamente identifico los duplicados por que hay
algunos que despues tengo que descartar, son 20 de
62000, pero los 10 que descarto es por que esta
empresa trae un solo color de ese articulo, mientras
que la otra trae todos los colores, pero mientras que
en el proveedor son n articulos en el cliente que los
compra es un solo articulo.
>
> Yo buscaria primero quienes y cuantos son los que
> estan duplicados
>
> SELECT id_articulo, count(*)
> FROM central.articulo_proveedor As Tmp
> GROUP BY id_articulo,id_proveedor HAVING
> Count(*)>1
> And temp.id_proveedor =
> central.articulo_proveedor.id_proveedor
>
> Luego si hubiera un registro_id unico que
> identificara al registro como
> unico - valga la redundancia- , los pongo dentro de
> un in
> (reg_id1,reg_34,...,regnn) y los borro y deberia
> quedar tu tabla arreglada.
> Si
> id_articulo es serial
> id_proveedor es serial en la tabla proveedores
> no me doy cuenta en donde se duplicaron..?, con todo
> respeto..!
>
> ahora si id_articulo es un numero ingresado y no
> serial, yo a esa tabla
> le pondria un art_id serial primary key, para poder
> identificar como
> unicas las filas y si te ocurriera que se te duplico
> de esta manera
> podes arreglarlo mas facil.
>
> Bueno, saludos a todos y a aprender !!!!
>
> Mario
> Mar del Plata
> Argentina
>
> Oswaldo Hernández escribió:
> > Gabriel Hermes Colina Zambra escribió:
> >> Estimados amigos de la lista
> >>
> >> Probe hacer una consulta a una tabla para buscar
> >> duplicados de dos campos, id_articulo y
> id_proveedor
> >> para identificar por cuales eran y borrarlos para
> >> luego crear un indice unico sobre estos campos,
> la
> >> tabla tiene la relacion del id de mi articulo con
> el
> >> id del articulo en el proveedor y cuenta con
> 62000
> >> registros, un poco mas.
> >>
> > ...
> >> SELECT central.articulo_proveedor.id_articulo,
> >> central.articulo_proveedor.id_proveedor,
> >> central.articulo_proveedor.id_en_proveedor,
> >> central.articulo_proveedor.dto1,
> >> central.articulo_proveedor.dto2,
> >> central.articulo_proveedor.unidades_x_envase,
> >> central.articulo_proveedor.id_imagen INTO
> dupartprov
> >> FROM central.articulo_proveedor
> >> WHERE (((central.articulo_proveedor.id_articulo)
> In
> >> (SELECT id_articulo FROM
> central.articulo_proveedor As
> >> Tmp GROUP BY id_articulo,id_proveedor HAVING
> >> Count(*)>1 And id_proveedor =
> >> central.articulo_proveedor.id_proveedor)))
> >> ORDER BY central.articulo_proveedor.id_articulo,
> >> central.articulo_proveedor.id_proveedor;
> >
> > En el select que haces dentro de la clausula where
> no especificas si
> > los campos de agrupamiento pertenecen a la tabla
> > 'central.articulo_proveedor' del from principal, o
> a la misma tabla de
> > ese select anidado que tiene el alias Tmp:
> >
> > select
> > ...
> > WHERE central.articulo_proveedor.id_articulo) In
> > (SELECT id_articulo FROM
> central.articulo_proveedor As Tmp
> > GROUP BY
> > id_articulo,id_proveedor
> > -- Esto deberia ser: Tmp.id_articulo,
> Tmp.id_proveedor
> > HAVING
> > Count(*)>1 And id_proveedor =
> > central.articulo_proveedor.id_proveedor)
> > -- y esto: Count(*)>1 And Tmp.id_proveedor =
> > central.articulo_proveedor.id_proveedor
> >
> > Es posible que se este liando con eso.
> >
> >
> > De todas formas lo estas complicando mucho, para
> localizar los
> > duplicados te bastaria, y seria mas rapido con
> algo como esto:
> >
> > SELECT
> > ap.id_articulo,
> > ap.id_proveedor,
> > max(ap.id_en_proveedor) as id_en_proveedor,
> > max(ap.dto1) as dto1,
> > max(ap.dto2) as dto2,
> > max(ap.unidades_x_envase) as
> unidades_x_envase,
> > max(ap.id_imagen) as id_imagen,
> > count(*) as repeticiones
> > INTO
> > dupartprov
> > FROM
> > central.articulo_proveedor as ap
> > GROUP BY
> > ap.id_articulo,
> > ap.id_proveedor
> > HAVING
> > count(*)>1
> > ORDER BY
> > ap.id_articulo,
> > ap.id_proveedor;
> >
> >
> > Saludos,
>
> ---------------------------(fin del
> mensaje)---------------------------
> TIP 8: explain analyze es tu amigo
>
Gracias por tu respuesta.
El id_artculo y el id_proveedor son unicos en las
diferentes tablas, es mas son primary key, El tema es
que justo se me da una dualidad, en la tercera tabla,
hay empresas en que debe admitir la duplicacion por
que el id_en_proveedor, que es como lo llama el
proveedor en un cliente debe permitir duplicados para
el mismo proveedor, y en otro cliente requieren que
no. entonces lo debo impedir.
Los duplicados surgieron por que se extrajo
informacion de otra aplicacion antes que me dijeran
que en esa empresa los requerimientos hacian que se
debiera impedir pueso que los articulos de distinto
color se disgregaban en la tabla articulos, mientras
que en la otra empresa se juntaban en un solo id.
Atte. Gabriel Hermes Colina Zambra
__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
Regístrate ya - http://correo.espanol.yahoo.com/
From | Date | Subject | |
---|---|---|---|
Next Message | Jaime Casanova | 2007-06-02 21:30:31 | Re: velocidad en consulta con like |
Previous Message | Gabriel Hermes Colina Zambra | 2007-06-02 21:10:54 | Re: Busqueda de duplicados, con demora. |