pullphone's blog このページをアンテナに追加 RSSフィード Twitter

2012-12-03

「INSERT INTO 〜 SELECT 〜」のSELECT結果を「ON DUPLICATE KEY UPDATE 〜」で使う

「ON DUPLICATE KEY UPDATE」という構文がMySQL独自のものと知ったときは軽くショックを受けました*1

まあ、そんなことはどうでもいいんです。
通常、「INSERT INTO 〜 SELECT 〜」ってGROUP節を使って集計したものをどっかのテーブルに入れるとかっていう時に使うと思うんですが、その集計結果が既にあるときにUPDATEする、ということがしたいですよね。
例えば次のようなクエリで。

INSERT INTO total (id,count)
SELECT id, count FROM daily GROUP BY date

私は最初次のようにやってみましたが、これはエラーになります。

INSERT INTO total (id,count)
(SELECT id, count FROM daily GROUP BY date) t
ON DUPLICATE KEY UPDATE count = t.count

後から気づいたんですが、そもそもサブクエリ全体に派生テーブル名をつけてどうすんだって話ですね。
正しくはこうです。

INSERT INTO total (id,count)
SELECT id, count FROM (SELECT id, count FROM daily GROUP BY date) t
ON DUPLICATE KEY UPDATE count = t.count

*1oracleにはMERGEっていう似たものがあるらしいですが詳細は知りません。あとポスグレはストアドプロシージャ使うらしいです

ezitezit 2016/07/12 20:03 Thank you

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/pullphone/20121203/1354502080
リンク元