2011-11-02 46 views
0
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

我不知道为什么你认为你目前的解决方案是在一些不足之处,但(如果涨幅从等级可计算的)一个解决办法是使用公式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)都不以其可扩展性而闻名。尽可能早地减少行数通常会更好。

+0

当前等级与百分比增加无关。但取决于当前等级,我们会按指定的百分比更新收入和年收入。 – pavi

+0

@pavi:然后看看最后的交易解决方案。这是(IMNSHO)比(现在错误的)“增加 - 等级”解决方案和原始问题中的复杂表达式更加明确。 – paxdiablo

+0

我应该在单个查询中执行更新,因为它会增加服务器 – pavi