----- Original Message -----
From: "Emanuel Calvo Franco" <[email protected]>
To: "pgsql-es-ayuda" <[email protected]>
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
<[email protected]> 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
--
TIP 9: visita nuestro canal de IRC #postgresql-es en irc.freenode.net