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%';
我正在根据相同的条件更新两个不同表的两列,如何使用单个案例执行此操作?
提前致谢
答案 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
)的可伸缩性都不为人所知。通常最好尽早减少行数。