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

元のステートメントは十分に短く、理解しやすく、これらの個別の UPDATE ステートメントのそれぞれで影響を受けた行があったかどうかを判断できます。

ただし、多数のステートメントの場合、個々のステートメントを実行するためにデータベースへの「ラウンドトリップ」を行うため、かなりの量のオーバーヘッドが生じます。1 回のステートメント実行で更新をまとめて "バッチ処理" することにより、大量の更新セットの実行を大幅に高速化 (経過時間の短縮) することができます。

したがって、それはあなたが達成しようとしていることに依存します。

より良い?それをどのように定義するかによって異なります。(ステートメントをより理解しやすく、デバッグしやすくし、リソースをあまり消費しないようにする必要がありますか?

もっと効率的?経過時間の短縮という点では、もちろん、これらと同じ更新を行う方法は他にもありますが、ステートメントはあなたのものほど理解しにくいものです。

短い?文字数の少ない SQL ステートメントに関しては、はい、それを実現する方法があります。(いくつかの例は他の回答に示されていますが、それらの回答のいくつかのステートメントの影響は、あなたのステートメントとは大幅に異なることに注意してください.)

これらの選択肢の実際のパフォーマンスは、実際には行数と利用可能なインデックスに依存します。(たとえば、groupId = 37 の行が数十万あり、そのうち 5 行しか更新していない場合)。

于 2012-07-27T15:32:47.787 に答える
0

一時テーブルを作成し、更新するすべてのレコードのスコア、ユーザー、およびグループ ID を挿入してから、次のようにすることができます。

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 に答える