----- 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

Responder a