UPDATE anidados con Select en MySQL

Aquien no se le ha presentado actualizar varios registros desde cualquier lenguaje de programacion, la idea mas barata y rapida era recorer toda la tabla y generando las actualizaciones

'Un fragmento de codigo VB6 y Jet
Set rMarca = dbSYS.OpenRecordset("select * from pla_detalle_2010 where pla_id=161")
While Not rMarca.EOF
  'Aqui va todo su proceso de actualizacion
  dbSys.OpenRecordSet "UPDATE pla_detalle_2010 SET ......."
  rMarca.MoveNext
Wend

Sin embargo lo letal y mortal de estas procedimientos se vuelven demasiado lentos cuando se ejecuta grandes resultados, la solucion mas simple a todo es problema es usar el mismo SQL pero anidados.

UPDATE pla_detalle_2010 SET total_dias=(
SELECT COUNT(tra_id) AS dias FROM tmp_pla_marca
WHERE tmp_pla_marca.tra_id=pla_detalle_2010.tra_id  )
WHERE pla_detalle_2010.pla_id = 161;
UPDATE pla_detalle_2010 SET total_horas=(
SELECT SUM(total_hor_lab) + SUM(total_hor_ext) AS t FROM tmp_pla_marca
WHERE tmp_pla_marca.tra_id=pla_detalle_2010.tra_id  )
WHERE pla_detalle_2010.pla_id = 161;

Observa este SQL aki sumamos para total_rem y en total_des hacemos dos operaciones para sumarse entre las dos

UPDATE pla_detalle_2010 SET
total_rem=(SELECT SUM(rem_calculado) as total FROM tmp_pdi
    WHERE tmp_pdi.tra_id=pla_detalle_2010.tra_id and aporte=0),
total_des=(SELECT SUM(rem_calculado) as total FROM tmp_pdi
    WHERE tmp_pdi.tra_id=pla_detalle_2010.tra_id and aporte=1) + (
    SELECT SUM(rem_calculado) as total FROM tmp_pdi
    WHERE tmp_pdi.tra_id=pla_detalle_2010.tra_id and aporte=2)
WHERE pla_detalle_2010.pla_id = 161;

Otro ejemplo de SQL es cuando se busca generar resumenes

Nombre    fecha     inversión
--------------------------------
 Juan      2009        10
 Pepe      2009        20
 Olga      2009        30
 Juan      2010        40
 Pepe      2010        50
 Olga      2010        60

y el resultado requerido seria +- asi

     Juan  Pepe  Olga
2009   10   20    30
2010   40   50    60

el SQL en cuestion sera asi

SELECT
    anio,
    sum(if(nombre= 'Juan',inversion,0)) AS Juan,
    sum(if(nombre = 'Pepe',inversion,0)) AS Pepe,
    sum(if(nombre = 'Olga',inversion,0)) AS Olga
FROM la_tabla_de_la_que_quiero_sacar_la_info GROUP BY 1;
This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>