プロが教えるわが家の防犯対策術!

バッチ処理で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)】の部分が間違っていると思うのですが・・・それともバッチの作り方が悪いのでしょうか?

どなたかよろしくお願いします<(_ _)>

A 回答 (5件)

#4回答者です。



#3さんの回答の削除の条件を、以下のように変えてみてください。
(日付はdate型でなく、数値列とのことなので)

select @maxdate:=max(日付) from 重点商品管理.重点商品;

delete from 重点商品管理.重点商品 where 日付 <= @maxdate-10000;
    • good
    • 0
この回答へのお礼

ありがとうございました。
出来ました!
あらためてバッチ処理・SQL文について勉強したいと思いました。
皆さんこれからもよろしくお願いします。

お礼日時:2006/04/12 08:53

where 日付<=max(日付)


というのは、構文として間違っています。

max等を比較で使用できるのは、group byを使用し、havingで条件指定するケースです。

副問い合わせ(サブクエリ)を使用し、
where 日付<=(select max(日付) from ~)
という方法もありますが、サポートバージョンが
MySQLの4.1以降だと記憶しています。
そのため、#1、#2さんの回答は、エラーになってしまう可能性があります。

#3さんの方法で、大丈夫ではないかと思います。
    • good
    • 0

バッチ処理でしたら、変数を使って見てはいかがでしょうか?



まず、最大日付を取得して、変数に格納します。
select @maxdate:=max(日付) from 重点商品管理.重点商品;
@maxdateは変数になります。
これを使用して、
delete from 重点商品管理.重点商品 where 日付 <= date_add(@maxdate,interval -1 month);

で、変数より一ヶ月前より小さいか等しい値を削除しています。

これでいかがでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございました。
変数が使えるのですね。
これなら他にもいろいろ使えそうです。

お礼日時:2006/04/12 08:52

#1です


SQL文を間違えていました
MySQLは使ったことがないので動作するかはわかりませんが...

DELETE FROM 重点商品管理.重点商品 WHERE 日付 <= (select MAX(日付)-10000 from 重点商品管理)
    • good
    • 0
この回答へのお礼

丁寧にありがとうございましたm(__)m
どうやら私のバージョンではサポートされていないようです。
しかしSQL文の書き方について大変参考になりました。
ありがとうございました

お礼日時:2006/04/12 08:50

DELETE FROM 重点商品管理.重点商品 WHERE 日付 <= (select MAX(日付)-10000 from 重点商品管理.重点商品)



試してないのでわかりませんが、これで動かないですかね?

あと、使用しているデータベースがわかれば、より具体的なアドバイスをもらえるかもしれません

この回答への補足

ありがとうございます。<(_ _)>
残念ながら動きませんでした。

Something is wrong in your syntax : 'select MAX(日付)-10000 from 重点商品管理.重点商品)' ノユカ・ : 1 ケヤフワ

というエラーメッセージが出ました

データベースはMYSQL4.0.26-ntです。
よろしくお願いします。

補足日時:2006/04/11 12:10
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!