Ver Mensaje Individual
  #4  
Antiguo 09-05-2011
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.735
Reputación: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Empecemos:
Código SQL [-]
update aux_infplanta
set aux_infplanta.m3producidos =
  (select (art_planta.m3xhora * (infplanta.hmetro_termino - infplanta.hmetro_inicio))
   from  infplanta,  art_planta, aux_infplanta
   where infplanta.infnro = aux_infplanta.numinf
   and   aux_infplanta.codart = art_planta.codart
   and   infplanta.planta = art_planta.codplanta
   and   infplanta.fecha > (:FECHA)
  )
El update recorre los 50.000 registros de aux_infplanta.
Para cada registro ejecuta el select. Este select no está filtrado, pues la línea aux_infplanta.codart = art_planta.codart no sabe si se refiere al registro de la tabla que se está "updateando" o al registro que se está "seleccionando".
Deberías utilizar alias para resolver este caso:
Código SQL [-]
update aux_infplanta UPD
set aux_infplanta.m3producidos =
  (select (art_planta.m3xhora * (infplanta.hmetro_termino - infplanta.hmetro_inicio))
   from  infplanta,  art_planta, aux_infplanta
   where infplanta.infnro = aux_infplanta.numinf
   and   aux_infplanta.codart = art_planta.codart
   and   UPD.codart = aux_infplanta.codart
   and   infplanta.planta = art_planta.codplanta
   and   infplanta.fecha > (:FECHA)
  )

Aqui le digo que el select me devuelva solo los registros que contienen el mismo CODART que el registro que estoy "updateando".

Te propongo que para que el SQL sea más simple utilices JOINS y ALIAS:

Código SQL [-]
update aux_infplanta UPD
set aip.m3producidos =
  (select (ap.m3xhora * (infplanta.hmetro_termino - infplanta.hmetro_inicio))
   from  infplanta ip
   join art_planta ap on ip.planta = ap.codplanta
   join aux_infplanta aip on aip.codart = ap.codart
   where 
   ip.infnro = aip.numinf and 
   ip.fecha > (:FECHA)
   and UPD.codart = aux_infplanta.codart
  )

Ten en cuenta que para hacer los joins es conveniente utilizar todos los campos de las Foreign Keys. No conozco tu base de datos, por lo que quizás no sea la mejor manera de hacer los joins.
Responder Con Cita