Problemas con Uniones y Unique

From: "Agustin Casiva" <casivaagustin(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Problemas con Uniones y Unique
Date: 2006-10-10 10:34:44
Message-ID: 646eb5870610100334vcadbb7kb96dffd35bd7d926@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola gente, tengo una consulta, estoy haciendo unas consultas con
uniones en una postgresql ver 8.1 sobre windows XP sp1, el tema es que
despues no estaba obteniendo los resultados esperados, me faltaba
información.

Cuando me pongo a analizar el plan de ejcución veo que al final de las consultas
se añade una funcion unique que es la que esta filtrandome los resultados
que estoy pretendiendo ver.

Pueden una de las consultas, la otra es muy similar, a continuación

SELECT v.idVenta as ID, v.Fecha, Cl.Cliente as Persona, ef.Total,
'VENTAS' as Tipo FROM
ventas v, EfectivoVentas ef, Clientes Cl WHERE
Cl.idCliente=v.idCliente AND v.FormaPago like '%EF%' AND
v.Fecha>='08/10/2006' AND v.Fecha<='08/10/2006'
UNION
SELECT c.idCompra as ID, c.Fecha, p.Proveedor as Persona, - ef.Total,
'COMPRAS' as Tipo FROM
compras c, EfectivoCompras ef, Proveedores p WHERE ef.idCompra=
c.idCompra AND p.idProveedor=c.idProveedor AND
c.FormaPago like '%EF%' AND c.Fecha>='08/10/2006' AND c.Fecha<='08/10/2006'
UNION
SELECT g.idGasto as ID, g.Fecha, c.Cuenta as Persona, -g.Monto as
Total, 'GASTOS' as Tipo FROM
Gastos g, Cuentas C WHERE c.idCuenta=g.idCuenta AND
g.Fecha>='08/10/2006' AND g.Fecha<='08/10/2006'
UNION
SELECT p.idVenta as ID, p.Fecha, C.Cliente as Persona, p.Monto as
Total, 'PAGVENT' as Tipo FROM
RegPagoVenta p, Ventas V, Clientes C WHERE p.idVenta=V.idVenta AND
v.idCliente=c.idCliente AND p.Fecha>='08/10/2006' AND
p.Fecha<='08/10/2006'
UNION
SELECT p.idCompra as ID, p.Fecha, c.Proveedor as Persona, -p.Monto as
Total, 'PAGCCOMP' as Tipo FROM
RegPagoCompra p, Compras V, Proveedores C WHERE p.idCompra=V.idCompra
AND v.idProveedor=c.idProveedor AND p.Fecha>='08/10/2006' AND
p.Fecha<='08/10/2006'

El plan de ejecución es

Unique (cost=297.40..315.18 rows=1185 width=157)
-> Sort (cost=297.40..300.36 rows=1185 width=157)
Sort Key: id, fecha, persona, total, tipo
-> Append (cost=0.00..236.90 rows=1185 width=157)
-> Subquery Scan "*SELECT* 1" (cost=0.00..66.14
rows=1180 width=157)
-> Nested Loop (cost=0.00..54.34 rows=1180 width=157)
-> Nested Loop (cost=0.00..20.74 rows=1 width=139)
-> Seq Scan on ventas v
(cost=0.00..14.90 rows=1 width=38)
Filter: (((formapago)::text ~~
'%EF%'::text) AND (fecha >= '2006-10-08'::date) AND (fecha <=
'2006-10-08'::date))
-> Index Scan using pk_clientes on
clientes cl (cost=0.00..5.82 rows=1 width=135)
Index Cond: (cl.idcliente =
"outer".idcliente)
-> Seq Scan on efectivoventas ef
(cost=0.00..21.80 rows=1180 width=18)
-> Subquery Scan "*SELECT* 2" (cost=0.00..26.93 rows=1
width=157)
-> Nested Loop (cost=0.00..26.92 rows=1 width=157)
-> Nested Loop (cost=0.00..21.09 rows=1 width=139)
-> Seq Scan on compras c
(cost=0.00..15.25 rows=1 width=38)
Filter: (((formapago)::text ~~
'%EF%'::text) AND (fecha >= '2006-10-08'::date) AND (fecha <=
'2006-10-08'::date))
-> Index Scan using pk_proveedores on
proveedores p (cost=0.00..5.82 rows=1 width=135)
Index Cond: (p.idproveedor =
"outer".idproveedor)
-> Index Scan using pk_efectivocompras on
efectivocompras ef (cost=0.00..5.82 rows=1 width=35)
Index Cond: (ef.idcompra = "outer".idcompra)
-> Subquery Scan "*SELECT* 3" (cost=0.00..26.60 rows=2
width=117)
-> Nested Loop (cost=0.00..26.58 rows=2 width=117)
-> Seq Scan on gastos g (cost=0.00..16.90
rows=2 width=56)
Filter: ((fecha >= '2006-10-08'::date)
AND (fecha <= '2006-10-08'::date))
-> Index Scan using pk_cuentas on cuentas c
(cost=0.00..4.82 rows=1 width=95)
Index Cond: (c.idcuenta = "outer".idcuenta)
-> Subquery Scan "*SELECT* 4" (cost=58.23..58.62
rows=1 width=157)
-> Merge Join (cost=58.23..58.61 rows=1 width=157)
Merge Cond: ("outer".idcliente = "inner".idcliente)
-> Sort (cost=45.38..45.39 rows=4 width=56)
Sort Key: v.idcliente
-> Nested Loop (cost=0.00..45.34
rows=4 width=56)
-> Seq Scan on regpagoventa p
(cost=0.00..22.00 rows=4 width=39)
Filter: ((fecha >=
'2006-10-08'::date) AND (fecha <= '2006-10-08'::date))
-> Index Scan using ix_idventa
on ventas v (cost=0.00..5.82 rows=1 width=34)
Index Cond:
("outer".idventa = v.idventa)
-> Sort (cost=12.85..13.02 rows=70 width=135)
Sort Key: c.idcliente
-> Seq Scan on clientes c
(cost=0.00..10.70 rows=70 width=135)
-> Subquery Scan "*SELECT* 5" (cost=58.23..58.62
rows=1 width=157)
-> Merge Join (cost=58.23..58.61 rows=1 width=157)
Merge Cond: ("outer".idproveedor =
"inner".idproveedor)
-> Sort (cost=45.38..45.39 rows=4 width=56)
Sort Key: v.idproveedor
-> Nested Loop (cost=0.00..45.34
rows=4 width=56)
-> Seq Scan on regpagocompra p
(cost=0.00..22.00 rows=4 width=39)
Filter: ((fecha >=
'2006-10-08'::date) AND (fecha <= '2006-10-08'::date))
-> Index Scan using pk_compras
on compras v (cost=0.00..5.82 rows=1 width=34)
Index Cond:
("outer".idcompra = v.idcompra)
-> Sort (cost=12.85..13.02 rows=70 width=135)
Sort Key: c.idproveedor
-> Seq Scan on proveedores c
(cost=0.00..10.70 rows=70 width=135)

Trate bastante de entender por que aparece este filtro y no lo puedo
determinar :-(


Alguien sabe por que pasa esto o en que parte del manual lo explica.

Gracias

--
Agustin Casiva - Desarrollador de Sistemas

www.casivaagustin.com.ar
casivaagustin(at)gmail(dot)com

http://www.osis.com.ar

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Oswaldo Hernández 2006-10-10 13:58:57 Crear nuevos tipos
Previous Message Jaime Casanova 2006-10-10 05:38:04 Re: Command Prompt --- como se usa?