Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Otra consulta SQL (https://www.clubdelphi.com/foros/showthread.php?t=4395)

Viet 14-10-2003 20:03:14

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?

__cadetill 14-10-2003 20:30:06

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

guillotmarc 14-10-2003 20:34:49

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.

Viet 14-10-2003 20:34:59

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.... :(

Viet 14-10-2003 20:36:23

Marc , justo estaba posteando al mismo tiempo que tu....... pero tengo la misma respuesta :(


Gracias de todos modos a ambos

guillotmarc 14-10-2003 20:39:13

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.

Viet 14-10-2003 20:46:44

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)

guillotmarc 14-10-2003 21:08:41

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.

Viet 14-10-2003 21:58:45

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


La franja horaria es GMT +2. Ahora son las 00:38:47.

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