Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #4  
Antiguo 09-05-2011
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
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
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
UPDATE con SELECT como??? advancexz SQL 4 17-03-2009 12:13:50
transacciones y select for update tksko MySQL 1 17-12-2008 16:50:22
Select bloquea update luis1980 MySQL 2 22-09-2008 12:51:04
Update Select JAI_ME Varios 2 18-07-2008 23:36:15
Un select y update en una misma instruccion dmagui SQL 2 06-07-2005 17:17:49


La franja horaria es GMT +2. Ahora son las 22:56:11.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi