Re[2]: Left Outer join

From: Miguel Bernilla Sánchez <mbernilla(at)sedapal(dot)com(dot)pe>
To: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re[2]: Left Outer join
Date: 2006-04-18 20:34:32
Message-ID: 836272193.20060418153432@sedapal.com.pe
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Estamos evaluando migrar de ORACLE a PostgreSQL y en nuestras
aplicaciones tenemos querys (varias decenas) como el siguiente:

SELECT "RECIBOS"."F_FACT",
"RECIBOS"."SEC_REC",
"RECIBOS"."NIS_RAD",
"RECIBOS"."SEC_NIS",
"RECIBOS"."IMP_TOT_REC",
"RECIBOS"."NRO_FACTURA",
"RECIBOS"."EST_ACT",
"RECIBOS"."SEC_REC_ANUL",
to_char("RECIBOS"."F_FACT_ANUL",'DD/MM/YYYY'),
"RECIBOS"."TIP_REC",
"AGENCIAS"."NOM_AGENCIA",
"SUCURSALES"."NOM_SUCURSAL",
'ü',
"RECIBOS"."SIMBOLO_VAR",
"RECIBOS"."SEC_CTA",
"RECIBOS"."F_PUESTA_COBRO",
"RECIBOS"."IMP_CTA",
"RECIBOS"."COD_AGENCIA",
"RECIBOS"."F_VCTO_FAC",
"RECIBOS"."F_COBRO"
FROM "SUCURSALES", "AGENCIAS", "RECIBOS"
WHERE ( "RECIBOS"."COD_SUCURSAL" = "SUCURSALES"."COD_SUCURSAL"(+) ) AND
( "RECIBOS"."COD_AGENCIA" = "SUCURSALES"."COD_AGENCIA"(+) ) AND
( "RECIBOS"."COD_AGENCIA" = "AGENCIAS"."COD_AGENCIA"(+) ) AND
( "RECIBOS"."SEC_NIS" = :secnis ) AND
( "RECIBOS"."NIS_RAD" = :nis ) AND
( "RECIBOS"."EST_ACT" <> 'ER315') AND
( :parametro = 1) AND
( "RECIBOS"."COD_CLI" = :codcli )

UNION
SELECT "PAGOS"."F_FACT",
"PAGOS"."SEC_REC",
"PAGOS"."NIS_RAD",
"PAGOS"."SEC_NIS",
"RECIBOS"."IMP_TOT_REC",
"RECIBOS"."NRO_FACTURA",
"RECIBOS"."EST_ACT",
"RECIBOS"."SEC_REC_ANUL",
to_char("RECIBOS"."F_FACT_ANUL",'DD/MM/YYYY'),
"PAGOS"."TIPREC",
"AGENCIAS"."NOM_AGENCIA",
"SUCURSALES"."NOM_SUCURSAL",
'ü',
"PAGOS"."SIMBOLO_VAR",
"RECIBOS"."SEC_CTA",
"RECIBOS"."F_PUESTA_COBRO",
"PAGOS"."IMP_PAGO",
"PAGOS"."COD_AGENCIA",
"RECIBOS"."F_VCTO_FAC",
"PAGOS"."F_PAGO"
FROM "SUCURSALES", "AGENCIAS", "RECIBOS", "PAGOS"
WHERE ( "PAGOS"."COD_SUCURSAL" = "SUCURSALES"."COD_SUCURSAL"(+) ) AND
( "PAGOS"."COD_AGENCIA" = "SUCURSALES"."COD_AGENCIA"(+) ) AND
( "PAGOS"."COD_AGENCIA" = "AGENCIAS"."COD_AGENCIA"(+) ) AND
( "RECIBOS"."SEC_NIS" = :secnis ) AND
( "RECIBOS"."NIS_RAD" = :nis ) AND
( "RECIBOS"."COD_CLI" = :codcli ) AND
( :parametro = 1) AND
( "RECIBOS"."EST_ACT" = 'ER315') AND
( "RECIBOS"."NIS_RAD" = "PAGOS"."NIS_RAD" ) and
( "RECIBOS"."SEC_NIS" = "PAGOS"."SEC_NIS" ) AND
( "RECIBOS"."SEC_REC" = "PAGOS"."SEC_REC" ) AND
( "RECIBOS"."F_FACT" = "PAGOS"."F_FACT" ) AND
( "RECIBOS"."SIMBOLO_VAR" = "PAGOS"."SIMBOLO_VAR" )

UNION
SELECT "RECIBOS"."F_FACT",
min("RECIBOS"."SEC_REC"),
min("RECIBOS"."NIS_RAD"),
min("RECIBOS"."SEC_NIS"),
sum("RECIBOS"."IMP_TOT_REC"),
min("RECIBOS"."NRO_FACTURA"),
min("RECIBOS"."EST_ACT"),
min("RECIBOS"."SEC_REC_ANUL"),
min(to_char("RECIBOS"."F_FACT_ANUL",'DD/MM/YYYY')),
min("RECIBOS"."TIP_REC"),
max("AGENCIAS"."NOM_AGENCIA"),
max("SUCURSALES"."NOM_SUCURSAL"),
'ü',
"RECIBOS"."SIMBOLO_VAR",
min("RECIBOS"."SEC_CTA"),
min("RECIBOS"."F_PUESTA_COBRO"),
sum("RECIBOS"."IMP_CTA"),
max("RECIBOS"."COD_AGENCIA"),
min("RECIBOS"."F_VCTO_FAC"),
max("RECIBOS"."F_COBRO")
FROM "SUCURSALES", "AGENCIAS", "RECIBOS"
WHERE ( "RECIBOS"."COD_SUCURSAL" = "SUCURSALES"."COD_SUCURSAL"(+) ) AND
( "RECIBOS"."COD_AGENCIA" = "SUCURSALES"."COD_AGENCIA"(+) ) AND
( "RECIBOS"."COD_AGENCIA" = "AGENCIAS"."COD_AGENCIA"(+) ) AND
( "RECIBOS"."SIMBOLO_VAR" LIKE to_char(:nis)||'%') AND
( :parametro = 2) AND
( "RECIBOS"."COD_CLI" = :codcli )
GROUP BY "RECIBOS"."SIMBOLO_VAR", "RECIBOS"."F_FACT"
ORDER BY 1 DESC, 2 ASC


y como verás, para mí va a ser más práctico contar con una forma
simplificada de reconstruir los Left Outer Join... antes que reescribirlos con el
estandar SQL. No es que me duelan los dedos o no quiera desgastar mi
teclado... es un tema de simplificar las cosas...

--
Saludos,
Miguel

====================
El mar, 18-04-2006 a las 14:36 -0500, Miguel Bernilla Sánchez escribió:
> Sres. a continuación muestro un query y su resultado:
>
> SELECT *
> FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name);
>
> city | temp_lo | temp_hi | prcp | date | name | location
> ---------------+---------+---------+------+------------+---------------+-----------
> Hayward | 37 | 54 | | 1994-11-29 | |
> San Francisco | 46 | 50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
> San Francisco | 43 | 57 | 0 | 1994-11-29 | San Francisco | (-194,53)
> (3 rows)
>
> Simplificando... en ORACLE podría hacerlo así:
> SELECT *
> FROM weather.city = cities.name(+);

> y en SQL SERVER (si no me equivoco):
> SELECT *
> FROM weather.city =* cities.name;

Eso me parece que en ambos casos es un producto cartesiano, lo que
precicamente no es LEFT OUTER.

> en POSTGRESQL existe alguna manera simplificada de hacerlo?

Te duelen muchos los dedos?

--
Juan Martínez
Depto. Inf.
UMC

============
Con fecha Martes, 18 de Abril de 2006, 03:13:57 p.m., escribió:

> Miguel Bernilla Sánchez escribió:
>> Sres. a continuación muestro un query y su resultado:
>>
>> SELECT *
>> FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name);

> Esa es la manera especificada por el estandar SQL.

>> en POSTGRESQL existe alguna manera simplificada de hacerlo?

> No; no es necesaria. Que buscas ahorrar, fuera de desgaste del teclado?

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2006-04-18 20:38:58 Re: Inconsistencia en foreign key
Previous Message proves_es 2006-04-18 20:30:25 Re: datagrid de VB 6.0