2012-07-27 62 views
1

是否有更好/更高效/更短的寫這個SQL查詢方式:寫入多個更新更有效的方式查詢

UPDATE mTable SET score = 0.2537 WHERE user = 'Xthane' AND groupId = 37; 
UPDATE mTable SET score = 0.2349 WHERE user = 'Mike' AND groupId = 37; 
UPDATE mTable SET score = 0.2761 WHERE user = 'Jack' AND groupId = 37; 
UPDATE mTable SET score = 0.2655 WHERE user = 'Isotope' AND groupId = 37; 
UPDATE mTable SET score = 0.3235 WHERE user = 'Caesar' AND groupId = 37; 
+4

請注意,某些建議的解決方案有可能更新比原始更多的行,並用NULL替換現有評分值,而原始語句不會這樣做。 – spencer7593 2012-07-27 15:17:19

+0

可以改變用戶數量嗎?或組的數量?這個查詢是否會動態構建?或者是更新常數,只有分數改變? – 2012-07-27 15:57:03

回答

5
UPDATE mTable 
SET score = 
    case user 
     when 'Xthane' then 0.2537 
     when 'Mike' then 0.2349 
     when 'Jack' then 0.2761 
     when 'Isotope' then 0.2655 
     when 'Caesar' then 0.3235 
     else score 
    end 
where groupId = 37 
+2

我會在用戶中添加一個where條件,因此當只需要更新5個行時,您不更新1,000,000行(大多數具有與當前相同的值)。 – HLGEM 2012-07-27 15:45:13

+0

@HLGEM這取決於數據 - 可能只有5個用戶groupId 37. – RedFilter 2012-07-27 15:47:48

+1

這是真的 - 你必須知道你的數據,但我希望OP意識到他可能會更新更多的記錄比打算。 – HLGEM 2012-07-27 16:56:27

1

您可以使用CASE語句來執行這種類型的UPDATE

UPDATE mTable 
SET score 
    = CASE user 
     WHEN 'Xthane' THEN 0.2537 
     WHEN 'Mike' THEN 0.2349 
     WHEN 'Jack' THEN 0.2761 
     WHEN 'Isotope' THEN 0.2655 
     WHEN 'Caesar' THEN 0.3235 
     ELSE score 
    END 
WHERE groupId = 37 
+1

這將潛在地更新比原始更多的行,併爲具有groupId = 37且具有與CASE表達式中列出的用戶不匹配的行的分數分配NULL。在CASE表達式中真的需要有一個'ELSE score'來保證我們不更新那些「不匹配」的行。要麼是這個,要麼是限制要更新的行的用戶列上的謂詞。 – spencer7593 2012-07-27 15:14:26

+0

@ spencer7593你是對的,我更新了它。我在寫查詢時錯過了它。謝謝 – Taryn 2012-07-27 15:16:33

0

您可以創建一個臨時表,插入得分,用戶和組識別所有要更新,然後做這樣的事情的記錄:

UPDATE 
FROM mTable m 
INNER JOIN tmpTable t 
    ON m.groupId = t.groupId 
    AND m.user = t.user 
SET m.score = t.score; 
0

你原來的報表看起來足夠短,且很容易理解,並且您可以確定是否有任何行受到每個單獨的UPDATE語句的影響。

但是,對於大量的語句,會有相當多的開銷使數據庫執行每條語句的「往返」。通過在單個語句執行中將更新「批處理」在一起,您可以獲得更快的執行速度(更短的運行時間)。

所以,這取決於你想要達到的目標。

更好?取決於你如何定義。 (這些陳述應該更容易理解,更容易調試,更少資源密集?

效率更高嗎?就減少耗用時間而言,是的,還有其他方法可以完成這些相同的更新,但是這些陳述並不那麼容易理解爲你的。

更短嗎?對於字符較少的SQL語句而言,是的,有很多方法可以實現這一點(某些示例在其他答案中有所顯示,但請注意這些答案中某些語句的影響與你的陳述差異很大)

這些替代方案的實際性能實際上取決於行數和可用索引。例如如果您擁有數十萬行groupId = 37的行,但只更新其中的5行)。