Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-10-2003
Viet Viet is offline
Miembro
 
Registrado: jul 2003
Ubicación: Argentina - Mar del Plata
Posts: 252
Poder: 21
Viet Va por buen camino
Otra consulta SQL

Buenas otra ves. (SQLServer)

lo que necesito hacer ahora es actualizar un campo con la suma de todos los valores de los registros que se encuentran en otra tabla

tabla1.campo = 9 <----- tabla2.campo = 4, 5 (son varios registros)

Código:
update a_llamadas
set
     requeridas= sum(ll_s.requeridas),
     diferencia= sum(ll_s.diferencia)
from a_llamadas_segmento ll_s
where 
    id_empleado=ll_s.id_empleado
group by ll_s.id_empleado
seria ideal poder hacer todo en una consulta como esta , pero obviamente que en una consulta de up date no puedo usar el grp by..... por lo que solo se me ocurre usar cursores o bien subconsultas ... pero no me convence ninguna de las dos, alguna sujerencia?
__________________
Marín Ignacio Borthiry (Viet) - "El hombre arriesga su vida cada vez que elije y eso es lo que lo hace libre" ;)
Responder Con Cita
  #2  
Antiguo 14-10-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
no se si te servirá, pero lo que si puedes hacer es algo así

Código:
update tabla a
set campo = (select sum(b.campo) 
             from tabla b
             where condiciones)
y en condiciones pones la unión entre las 2 tablas

Espero te sirva
Responder Con Cita
  #3  
Antiguo 14-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Hola.

Puedes usar subconsultas. Creo que algo así te serviria :

Código:
update a_llamadas set
       requeridas=(select sum(ll_s.requeridas) 
                   from a_llamadas_segmento ll_s
                   where a_llamadas.id_empleado=ll_s.id_empleado)
       diferencia= (select sum(ll_s.diferencia)
                   from a_llamadas_segmento ll_s
                   where a_llamadas.id_empleado=ll_s.id_empleado)
Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).

Última edición por guillotmarc fecha: 14-10-2003 a las 20:41:56.
Responder Con Cita
  #4  
Antiguo 14-10-2003
Viet Viet is offline
Miembro
 
Registrado: jul 2003
Ubicación: Argentina - Mar del Plata
Posts: 252
Poder: 21
Viet Va por buen camino
Gracias Cadetill , eso lo tenia en mente pero realmente en las tablas que manejo de unos 1.800.000 (por ahora )se pone muy lento el asunto..

de hecho proble eso y tambien hacer un select y correr con un cursor un Update por cada registro del select y es mucho mas eficiente eso, casi un tercio del tiempo, al contrario de lo q yo suponia... pero sigue siendo lento....
__________________
Marín Ignacio Borthiry (Viet) - "El hombre arriesga su vida cada vez que elije y eso es lo que lo hace libre" ;)

Última edición por Viet fecha: 14-10-2003 a las 20:37:51.
Responder Con Cita
  #5  
Antiguo 14-10-2003
Viet Viet is offline
Miembro
 
Registrado: jul 2003
Ubicación: Argentina - Mar del Plata
Posts: 252
Poder: 21
Viet Va por buen camino
Marc , justo estaba posteando al mismo tiempo que tu....... pero tengo la misma respuesta


Gracias de todos modos a ambos
__________________
Marín Ignacio Borthiry (Viet) - "El hombre arriesga su vida cada vez que elije y eso es lo que lo hace libre" ;)
Responder Con Cita
  #6  
Antiguo 14-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Hola.

Si va lento, comprueba que en la tabla a_llamadas_segmento tengas un índice para el campo id_empleado (o si intervienen más campos en la condición, comprueba que tengas un índice compuesto formado por esos campos).

Una consulta de este tipo, con los índices adecuados, no debería ser exageradamente lenta.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #7  
Antiguo 14-10-2003
Viet Viet is offline
Miembro
 
Registrado: jul 2003
Ubicación: Argentina - Mar del Plata
Posts: 252
Poder: 21
Viet Va por buen camino
Bien, tengo definido id_empleado y otro campo que necesito como indice, sin embargo la consulta con la Subconsulta es lo suficiente lenta como para pensar una alternativa....

De hecho me ha dado mejor resultado poner un cursor (al que lo trabajo como si fuera un While ) que usar esta query con subconsultas, yo estimo que esto sucede por la cantidad de registros..... pero ahora voy a probar con una tabla temporal y les cuento .....

(este tipo de situaciones me recuerdan al cuento del fisico que estaba posteado en humor.... Siempre hay que buscar la mejor solucion)
__________________
Marín Ignacio Borthiry (Viet) - "El hombre arriesga su vida cada vez que elije y eso es lo que lo hace libre" ;)
Responder Con Cita
  #8  
Antiguo 14-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Hola.

La ventaja del cursor es que solo tiene que acceder una vez a los datos, y calcula la suma para los dos campos.

Mientras que con subconsultas, hay que poner 2 subconsultas. Por lo que se realiza dos veces la consulta a los registros relacionados, para sumar los respectivos campos.

Alguna vez he tenido que hacer consultas con subconsultas sobre tablas con más de 100.000 registros, y cuando asignas los índices adecuados he conseguido que se ejecuten muy rapido. Aunque si en este caso, el numero de registros a sumar en la subconsulta es muy elevado, ningún indice conseguirá mejorar el rendimiento de un cursor, que también aprovecha los índices y solo recorre una vez los registros relacionados.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #9  
Antiguo 14-10-2003
Viet Viet is offline
Miembro
 
Registrado: jul 2003
Ubicación: Argentina - Mar del Plata
Posts: 252
Poder: 21
Viet Va por buen camino
Como siempre Marc , muchas gracias ....

es verdad lo que comentas , ya lo habia notado..

... pero en este caso la mejor solucion(que pude encontrar) es con una tabla temporal....

Creo una TablaTemporal, le inserto la Consulta con los resultados y luego realizo un Updete directo con esta tabla.

por lo que solo ejecuto dos consultas... es mucho mejor que usar el cursor y las subconsultas....

Muchisimas Gracias nuevamente.... y no se olviden que siempre es posible mejorar lo que hacemos... tan solo basta con mirar los problemas desde otros puntos....

Saludos
__________________
Marín Ignacio Borthiry (Viet) - "El hombre arriesga su vida cada vez que elije y eso es lo que lo hace libre" ;)
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 06:06:58.


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