2015-12-02 32 views
0

我輸入爲employee表,emp_ids數組和emp_joining_dates數組。我的員工表有3列,emp_id,emp_name & emp_joining_date。表有超過10k條記錄。我需要更新輸入數組中列出的emp_idsemp_joining_date如何用數組更新sql列?

我能夠通過循環來實現這一點,如下所示,

for 0 < i < emp_ids.length 
update employee set emp_joining_date = emp_joining_dates[i] where emp_id = emp_ids[i] //running update query multiple times 
end 

與上述方法的問題是,我打多個查詢分貝。使用單個查詢可以達到同樣的效果嗎?如果是,如何?我的問題不同於this。因爲我想用數組值更新列值,而不是單個/靜態值。

這個問題與編碼無關,所以請忽略for-loop語法。它與SQL查詢優化有關。

回答

0

您可以可能產生這樣的CASE語句(假設你有3名員工更新):

UPDATE employee SET emp_joining_date = CASE emp_id 
    WHEN emp_ids[0] THEN emp_joining_dates[0] 
    WHEN emp_ids[1] THEN emp_joining_dates[1] 
    WHEN emp_ids[2] THEN emp_joining_dates[2] 
END 
WHERE emp_id IN (emp_ids[0], emp_ids[1], emp_ids[2]) 

您應該測試,如果它實際上提供了更好的性能,但...

+0

不可行,因爲'emp_joining_dates'長度可能會有所不同 – Abhishek

+0

如果SQL是動態生成的,這可能會有效。 –

+0

因此,您使用的是不是動態生成SQL的客戶端語言? –

0

有兩家我可以立即看到的選項(下)。我假設加入日期對每位員工都是獨一無二的。

臨時表並立即加入

  1. 創建包含的ID和數據的臨時表進行上載。
  2. 加入這兩個並使用臨時表更新現有表。
  3. 刪除臨時表。

批更新成組

這是安德烈芭斯所提供方法。

處理它:)

第三個選項是隻接受數千個交易。這可能是一個不必要的優化(儘管我明白總會有更好的代碼)。

+0

是不是創建新表並加入等效於循環更新? – Abhishek

+0

不完全。您可以在一個(或者幾個)事務中加載一個包含大型數據集的表。您的交易次數將小於每行的更新次數。但是在一天結束時,你無法避免的事實是,你有10K行來更新每個具有自己獨特的值。無論如何,這不是真的可以減少任何重要的程度。 –