如何根据相同的条件更新多个列?

时间:2011-11-02 05:26:57

标签: mysql

    update employee as e,employee_salary as es
    set e.annualincome=
    case e.currentgrade
    when 1 then e.annualincome+e.annualincome*0.10
    when 2 then e.annualincome+e.annualincome*0.15
    end,
    es.income=
    case e.currentgrade
    when 1 then es.income+es.income*0.10
    when 2 then es.income+es.income*0.15
    end
    where e.employeeid=es.employeeid and salarydate >'2011-09-01%';

我正在根据相同的条件更新两个不同表的两列,如何使用单个案例执行此操作?

提前致谢

1 个答案:

答案 0 :(得分:0)

我不确定为什么你认为你当前的解决方案在某些方面存在缺陷,但是(如果增加可以从等级中计算出来),一种解决方案是在公式中使用currentgrade,例如:

update employee as e, employee_salary as es
    set e.annualincome = e.annualincome * (1.05 + e.currentgrade * 0.05),
    set es.income      = es.income      * (1.05 + e.currentgrade * 0.05)
where e.employeeid = es.employeeid
  and e.currentgrade in (1,2)
  and salarydate > '2011-09-01%';
但是,老实说,我坚持你拥有的东西。意图很明确,可以通过一些缩进管理更清晰: - )

由于您已经表明增加可以从等级中计算出来,另一种方法是在交易的控制下将其作为两个阶段来实现,这更加清晰:

update employee as e, employee_salary as es
    set e.annualincome = e.annualincome * 1.10,
    set es.income      = es.income      * 1.10
where e.employeeid = es.employeeid
  and e.currentgrade = 1
  and salarydate >'2011-09-01%';

update employee as e, employee_salary as es
    set e.annualincome = e.annualincome * 1.15,
    set es.income      = es.income      * 1.15
where e.employeeid = es.employeeid
  and e.currentgrade = 2
  and salarydate >'2011-09-01%';

如果您使用currentgrade上的索引,那么运行速度也会快得多。应用于每个行的每行函数(包括case)的可伸缩性都不为人所知。通常最好尽早减少行数。