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

4 回答 4

7
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
于 2012-07-27T15:06:14.953 回答
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
于 2012-07-27T15:07:06.397 回答
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;
于 2012-07-27T15:30:19.417 回答
0

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

然而,对于大量语句,“往返”到数据库以执行每个单独的语句会产生大量开销。通过在单个语句执行中将更新“批处理”在一起,您可以获得更快的执行速度(更短的运行时间)。

因此,这取决于您要达到的目标。

更好的?取决于你如何定义它。(这些语句是否应该更易于理解、更易于调试、资源占用更少?

更高效?就减少经过的时间而言,是的,还有其他方法可以完成这些相同的更新,但这些陈述不像你的那样容易理解。

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

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

于 2012-07-27T15:32:47.787 回答