From: | "Raul Andres Duque" <ra_duque(at)yahoo(dot)com(dot)mx> |
---|---|
To: | "Emanuel Calvo Franco" <postgres(dot)arg(at)gmail(dot)com>, "pgsql-es-ayuda" <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Actualizar registros de tabla basados en otra |
Date: | 2009-02-09 14:35:40 |
Message-ID: | 0FEDA8547E8640F1A5D5F88144CEF632@amadeus.net.co |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
----- Original Message -----
From: "Emanuel Calvo Franco" <postgres(dot)arg(at)gmail(dot)com>
To: "pgsql-es-ayuda" <pgsql-es-ayuda(at)postgresql(dot)org>
Sent: Monday, February 09, 2009 8:50 AM
Subject: Fwd: [pgsql-es-ayuda] Actualizar registros de tabla basados en otra
El día 9 de febrero de 2009 7:08, Raúl Andrés Duque Murillo
<ra_duque(at)yahoo(dot)com(dot)mx> escribió:
> Cordial saludo compañeros.
>
> Quisiera saber si a alguien se le ocurre una solución a este problema.
>
> Tengo un proceso que actualiza datos en una tabla basado en valores de
> otra
> tabla. Actualmente lo realizo DESDE LA APLICACION recorriendo la tabla
> base
> y por cada registro realizo una actualización en la tabla a actualizar,
> pero
> es MUY demorado por la cantidad de datos que actualmente se maneja y ahora
> quiero hacerlo desde la DB (pl/pgsql) y "set-oriented".
>
>
>Es poco practico recorrer siempre toda una tabla.
>te conviene hacerlo una vez sola y preparar una rule
>after update-insert-detete para la tabla original y que
>repita esa operacion sobre la otra tabla.
Si, fué una primera aproximación a la solución pero precisamente estoy
intentando volverlo menos iterativo y más set oriented.
> Más o menos el algoritmo que hago desde la aplicación es el siguiente:
>
> for each (select distinct muestra_par = id_parte, muestra_alm =
> id_almacen,
> muestra_loc = id_localizacion from def_salinvmes)
> select nuevovalor = valor
> from def_salinvmes
> where id_parte = muestra_par
> id_almacen = muestra_alm
> id_localizacion = muestra_loc
> order by anno_salinvmes desc, mes_salinvmes desc
> limit 1
>
> update def_existloc
> set valor = nuevovalor
> where id_parte = muestra_par
> id_almacen = muestra_alm
> id_localizacion = muestra_loc
> end for each
>
>
>No te conviene hacer lo asi?:
>fo each (select distinct muestra_par = id_parte,
> muestra_alm = id_almacen,
> muestra_loc = id_localizacion
> nuevovalor = valor
> from def_salivmes
> where id_parte = muestra_par
> id_almacen = muestra_alm
> id_localizacion = muestra_loc
> order by anno_salivmes desc, mes_salivmes desc)
>
> update def_existloc
> set valor = nuevovalor
> where id_parte = muestra_par
> id_almacen = muestra_alm
> id_localizacion = muestra_loc
> end for each
>
Lo que pasa es que id_parte, id_almacen, id_localizacion no es único para
def_salinvmes, por lo tanto traería varios registros y necesito sólo el más
nuevo, por eso consultar dentro del ciclo. Existe una candidata en
def_salinvemes por id_parte, id_almacen, id_localizacion, anno_salinvmes y
mes_salinvmes, de hecho tengo creado un índice únic por estos campos. La PK
es un serial.
>
> un UPSERT pero no me gusta la idea de crear y borrar este trigger cada vez
> que se corre el proceso ya que no podría tenerlo "vivo" en la operación
> normal.
>
>Es que si la regla ya esta activa... para que correr la actualizacion
>nuevamente?
Es que no quiero tener esa regla activa durante la aoperción normal ya que
podría pasar por alto errores.
>
>
> Cualquier comentario es bienvenido.
>
> Atentamente,
>
> RAUL DUQUE
> Bogotáq, Colombia
--
Emanuel Calvo Franco
Sumate al ARPUG !
(www.postgres-arg.org -
www.arpug.com.ar)
ArPUG / AOSUG Member
Postgresql Support & Admin
--
TIP 4: No hagas 'kill -9' a postmaster
From | Date | Subject | |
---|---|---|---|
Next Message | Emanuel Calvo Franco | 2009-02-09 15:20:12 | Re: Como hacer un for dentro de un trigger |
Previous Message | Vanessa | 2009-02-09 14:19:08 | Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Tsearch2: realizar búsqueda sin acentos |