- ベストアンサー
バッチ処理SQL文でmax関数を使った古いデータの削除
バッチ処理で1年前の古いデータの削除をしたいのですが日付が20060401のような数値になっています。 MAX関数を使ってSQL文を作ってみたのですが動きません(^_^;) ***BATファイル*** c:\mysql\bin\mysql -u user -p**** <c:\mysql\juten-del.sql ***SQL文*** DELETE FROM 重点商品管理.重点商品 WHERE 日付 <= (MAX(日付)-10000) かねやんMYSQLADMINを使うと≪Invalid use of group function≫とエラーメッセージが出ます。 【日付 <= 20050301】のように書くと削除されるので【日付 <= (MAX(日付)-10000)】の部分が間違っていると思うのですが・・・それともバッチの作り方が悪いのでしょうか? どなたかよろしくお願いします<(_ _)>
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#4回答者です。 #3さんの回答の削除の条件を、以下のように変えてみてください。 (日付はdate型でなく、数値列とのことなので) select @maxdate:=max(日付) from 重点商品管理.重点商品; delete from 重点商品管理.重点商品 where 日付 <= @maxdate-10000;
その他の回答 (4)
- chukenkenkou
- ベストアンサー率43% (833/1926)
where 日付<=max(日付) というのは、構文として間違っています。 max等を比較で使用できるのは、group byを使用し、havingで条件指定するケースです。 副問い合わせ(サブクエリ)を使用し、 where 日付<=(select max(日付) from ~) という方法もありますが、サポートバージョンが MySQLの4.1以降だと記憶しています。 そのため、#1、#2さんの回答は、エラーになってしまう可能性があります。 #3さんの方法で、大丈夫ではないかと思います。
- naochancom
- ベストアンサー率61% (41/67)
バッチ処理でしたら、変数を使って見てはいかがでしょうか? まず、最大日付を取得して、変数に格納します。 select @maxdate:=max(日付) from 重点商品管理.重点商品; @maxdateは変数になります。 これを使用して、 delete from 重点商品管理.重点商品 where 日付 <= date_add(@maxdate,interval -1 month); で、変数より一ヶ月前より小さいか等しい値を削除しています。 これでいかがでしょうか?
お礼
ありがとうございました。 変数が使えるのですね。 これなら他にもいろいろ使えそうです。
- bdr
- ベストアンサー率43% (35/80)
#1です SQL文を間違えていました MySQLは使ったことがないので動作するかはわかりませんが... DELETE FROM 重点商品管理.重点商品 WHERE 日付 <= (select MAX(日付)-10000 from 重点商品管理)
お礼
丁寧にありがとうございましたm(__)m どうやら私のバージョンではサポートされていないようです。 しかしSQL文の書き方について大変参考になりました。 ありがとうございました
- bdr
- ベストアンサー率43% (35/80)
DELETE FROM 重点商品管理.重点商品 WHERE 日付 <= (select MAX(日付)-10000 from 重点商品管理.重点商品) 試してないのでわかりませんが、これで動かないですかね? あと、使用しているデータベースがわかれば、より具体的なアドバイスをもらえるかもしれません
補足
ありがとうございます。<(_ _)> 残念ながら動きませんでした。 Something is wrong in your syntax : 'select MAX(日付)-10000 from 重点商品管理.重点商品)' ノユカ・ : 1 ケヤフワ というエラーメッセージが出ました データベースはMYSQL4.0.26-ntです。 よろしくお願いします。
お礼
ありがとうございました。 出来ました! あらためてバッチ処理・SQL文について勉強したいと思いました。 皆さんこれからもよろしくお願いします。