SELECT の集計結果でテーブルを UPDATE する SQL 文
2008年 4月 15日 00:53頻繁に使うのですが、結構いつもど忘れしてしまうので、メモっておきます。
例えば、次のような得点テーブル(score_data)とユーザ得点集計テーブル(user_total)があったとして、得点テーブルの集計結果で、ユーザ得点集計テーブルをアップデートする場合の SQL 文です。
SELECT * FROM score_data; test_date | user_name | score ------------+-----------+------- 2008-01-01 | A | 85 2008-01-01 | B | 65 2008-01-01 | C | 90 2008-02-01 | A | 76 2008-02-01 | B | 58 2008-02-01 | C | 88 2008-03-01 | A | 92 2008-03-01 | B | 70 2008-03-01 | C | 86 (9 rows) SELECT * FROM user_total; user_name | total_score -----------+------------- A | 0 B | 0 C | 0 (3 rows)
とりあえず、次のような感じで書くと
UPDATE user_total AS ut
SET total_score = (
SELECT SUM(sd.score) FROM score_data sd
WHERE sd.user_name = ut.user_name
GROUP BY sd.user_name
);
こんな感じでユーザ毎に合計点をアップデートできます。
SELECT * FROM user_total; user_name | total_score -----------+------------- A | 253 B | 193 C | 264 (3 rows)
