编写多个UPDATE查询的更有效方法

时间:2012-07-27 15:02:36

标签: mysql sql database oracle

编写此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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

您可以为要更新的所有记录创建临时表,插入分数,用户和groupid,然后执行以下操作:

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

答案 3 :(得分:0)

您的原始语句看起来很短,并且很容易理解,您可以确定每个单独的UPDATE语句是否有任何行受到影响。

但是,对于大量语句,会有相当多的开销使数据库“往返”以执行每个单独的语句。通过在单个语句执行中将更新“批处理”在一起,您可以更快地执行大量更新(更短的时间)。

所以,这取决于你想要实现的目标。

更好?取决于你如何定义它。 (这些陈述应该更容易理解,更容易调试,资源消耗更少吗?

效率更高?就减少的运行时间而言,是的,还有其他方法可以实现这些相同的更新,但这些语句并不像您的那样容易理解。

更短的?对于具有较少字符的SQL语句,是的,有一些方法可以实现这一点。 (其他答案中显示了一些示例,但请注意,其中一些答案中的陈述效果与您的陈述明显不同。)

这些替代方案的实际性能实际上取决于行数和可用索引。 (例如,如果您有数十万行,其中groupId = 37,但只更新其中5行)。