2011-11-02 49 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