同时update多个字段,类似下面这样的写法,但是mysql里不支持update tmprpt_ck_sfchzb set (xysl,xyje)=(select sum(sl) 'xysl',sum(je) as 'xyje' from ck_lsz where midx=tmprpt_ck_sfchzb.midx and 一系列其他条件);以前用的是笨法子:update tmprpt_ck_sfchzb set xysl=(select sum(sl) 'xysl' from ck_lsz where midx=tmprpt_ck_sfchzb.midx and 一系列其他条件),xyje=(select sum(je) as 'xyje' from ck_lsz where midx=tmprpt_ck_sfchzb.midx and 一系列其他条件);感觉同样的条件要select两次,是不是效率太差了,要是有3个字段,4个字段呢,那就更慢了吧?网上有通过group by出来一个子查询,再通过join的方法来update,但是这种方法对我没用,因为select求值的时候还有其他很多条件。有没有好方法,可以select一次,出来多个计算出来的值,能够update到对应的行中。也就是说可以实现以下语句的功能?update tmprpt_ck_sfchzb set (xysl,xyje)=(select sum(sl) 'xysl',sum(je) as 'xyje' from ck_lsz where midx=tmprpt_ck_sfchzb.midx and 一系列其他条件);

解决方案 »

  1.   

    mysql是不支持修改自己查自己得出的值,但是你可以骗它!你可给它括起来起个别名在查一下就可以了!
      

  2.   

    这个跟自己查自己没有关系,查的是另外一个表。现在的需求是一条根据表A的数据行作为条件select表B查出来两个或多个统计值,怎么同时update表A该行的多个对应字段。
      

  3.   

    MySQL不支持 这种写法
      

  4.   

    mysql 的多字段更新,需要用到子表;
    如下写法:UPDATE tmprpt_ck_sfchzb a,(SELECT midx ,SUM(sl) AS xysl,SUM(je) AS xyje FROM ck_lsz  GROUP BY midx) b 
    SET a.xysl=b.xysl ,a.xyje=b.xyje WHERE a.midx = b.midx;子表里面的表名后面可以添加其他条件;
      

  5.   


    谢谢,这其实就是我帖子里说的先group by再join,但是因为存在很多其他的限制条件,group的字段也是动态的,这个sql语句非常复杂,如果group by的子查询里不限制条件的话,又会全表统计了,很浪费,因为我实际上只需要满足条件的一小部分数据而已。我曾经想过用存储过程,对tmprpt_ck_sfchzb使用游标,循环体内select into两个变量,再update到tmprpt_ck_sfchzb对应的行上,但是不清楚效率是不是更低了?
      

  6.   

    子表记录不大的话,用sql和过程效率差不了多少;如果很大的话,过程最多不会锁表,但是效率高不高,需要测试过才知道;