From: | Alvaro Herrera <alvherre(at)commandprompt(dot)com> |
---|---|
To: | Gabriel Hermes Colina Zambra <hermeszambra(at)yahoo(dot)com> |
Cc: | Oswaldo Hernández <listas(at)soft-com(dot)es>, pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Busqueda de duplicados, con demora. SOLUCION |
Date: | 2007-06-05 14:31:48 |
Message-ID: | 20070605143148.GD8140@alvh.no-ip.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Gabriel Hermes Colina Zambra escribió:
> --- Alvaro Herrera <alvherre(at)commandprompt(dot)com>
> escribió:
> > explain
> > 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)
> > ORDER BY id_articulo, id_proveedor;
Ahh, ya entiendo lo que pasa. La query que te pasé obtiene los
id_articulo de los registros que aparecen duplicados segun el par
(id_articulo, id_proveedor), y luego obtiene todos los articulos con
cada uno de esos id_articulo, ignorando el id_proveedor.
Prueba esto otro:
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
FROM central.articulo_proveedor
WHERE (central.articulo_proveedor.id_articulo, central.articulo_proveedor.id_proveedor) In
(SELECT id_articulo, id_proveedor
FROM central.articulo_proveedor As Tmp
GROUP BY id_articulo, id_proveedor
HAVING Count(*)>1)
ORDER BY id_articulo, id_proveedor;
Observa que el HAVING de la subconsulta es mas simple (no necesitar
poner la condicion que lo liga a la tabla de la consulta externa), pero
el IN compara ahora dos columnas, no solo una; y los resultados que
entrega deberian ser los duplicados que te interesan. (Observa que le
quite la clausula INTO para poder hacer pruebas mas comodamente).
La consulta se demora 100ms, con 8010 registros en la tabla (10 de los
cuales son duplicados)
Aca hice lo siguiente para experimentar:
create schema central;
create table central.articulo_proveedor (id_articulo int, id_proveedor int,
id_en_proveedor int, dto1 int, dto2 int, unidades_x_envase int,
id_imagen bytea);
insert into central.articulo_proveedor (id_articulo, id_proveedor)
select * from generate_series(1, 1000) a,
generate_series (1, 40) b
where a % 4 = b % 5 ;
insert into central.articulo_proveedor (id_articulo, id_proveedor)
select * from generate_series(1, 1000) a,
generate_series (1, 40) b
where a % 4 = b % 5 and a % 3 = b % 7 limit 10;
analyze central.articulo_proveedor ;
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
From | Date | Subject | |
---|---|---|---|
Next Message | Jose Maria Mencia Fernandez | 2007-06-05 15:34:34 | Commit en PLPGSQL |
Previous Message | Alvaro Herrera | 2007-06-05 14:05:07 | Re: Fwd: sobre rowtype |