• ベストアンサー

バッチ処理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)】の部分が間違っていると思うのですが・・・それともバッチの作り方が悪いのでしょうか? どなたかよろしくお願いします<(_ _)>

  • MySQL
  • 回答数5
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

#4回答者です。 #3さんの回答の削除の条件を、以下のように変えてみてください。 (日付はdate型でなく、数値列とのことなので) select @maxdate:=max(日付) from 重点商品管理.重点商品; delete from 重点商品管理.重点商品 where 日付 <= @maxdate-10000;

13B-RE
質問者

お礼

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

その他の回答 (4)

回答No.4

where 日付<=max(日付) というのは、構文として間違っています。 max等を比較で使用できるのは、group byを使用し、havingで条件指定するケースです。 副問い合わせ(サブクエリ)を使用し、 where 日付<=(select max(日付) from ~) という方法もありますが、サポートバージョンが MySQLの4.1以降だと記憶しています。 そのため、#1、#2さんの回答は、エラーになってしまう可能性があります。 #3さんの方法で、大丈夫ではないかと思います。

回答No.3

バッチ処理でしたら、変数を使って見てはいかがでしょうか? まず、最大日付を取得して、変数に格納します。 select @maxdate:=max(日付) from 重点商品管理.重点商品; @maxdateは変数になります。 これを使用して、 delete from 重点商品管理.重点商品 where 日付 <= date_add(@maxdate,interval -1 month); で、変数より一ヶ月前より小さいか等しい値を削除しています。 これでいかがでしょうか?

13B-RE
質問者

お礼

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

  • bdr
  • ベストアンサー率43% (35/80)
回答No.2

#1です SQL文を間違えていました MySQLは使ったことがないので動作するかはわかりませんが... DELETE FROM 重点商品管理.重点商品 WHERE 日付 <= (select MAX(日付)-10000 from 重点商品管理)

13B-RE
質問者

お礼

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

  • bdr
  • ベストアンサー率43% (35/80)
回答No.1

DELETE FROM 重点商品管理.重点商品 WHERE 日付 <= (select MAX(日付)-10000 from 重点商品管理.重点商品) 試してないのでわかりませんが、これで動かないですかね? あと、使用しているデータベースがわかれば、より具体的なアドバイスをもらえるかもしれません

13B-RE
質問者

補足

ありがとうございます。<(_ _)> 残念ながら動きませんでした。 Something is wrong in your syntax : 'select MAX(日付)-10000 from 重点商品管理.重点商品)' ノユカ・ : 1 ケヤフワ というエラーメッセージが出ました データベースはMYSQL4.0.26-ntです。 よろしくお願いします。

関連するQ&A

  • バッチでのSQL実行結果の分岐処理について。

    バッチでのSQL実行結果の分岐処理について。 お世話になっております。 バッチからsqlを実行してその結果によってそれ以降のバッチ全体の処理を停止させる方法を考えています。 手がかりがつかめずまったく先に進めないためアドバイスをいただけますでしょうか。 バッチの内容(start_del.bat) -------------------------------------------------------- osql -i.\del.sql -o c:\wk\log.txt -S gold -E osql -i.\create.sql -o c:\wk\log.txt -S gold -E ------------------------------------------------------------ SQLの内容(del.sql) ------------------------------------------------------------ BEGIN TRANSACTION; DELETE FROM LDDB.dbo.test WHERE b='0'; IF @@ERROR = 0 <--エラー判定にこのコマンドを使おうと考えました BEGIN *********************** END ELSE BEGIN ********************** END COMMIT TRANSACTION; ------------------------------------------------------------ 処理の概要: 1.バッチで最初にdel.sqlを実行します。 2.del.sqlの実行が失敗すれば、2つ目のバッチであるcreate.sqlは実行ささずに、バッチを終了させます。 *ポイントはdel.sqlの結果というのは、バッチからdel.sqlを実行できたかではなく、del.sqlの実行結果を判断するという点です。 教えていただきたいこと ・del.sqlの実行後、制御がバッチに戻ったときに、結果を確認してバッチを継続させるか終了させるかを判断させる方法はどのような仕組みを作ればいいのでしょうか。 Windows2003サーバーで、SQLServerは2005です。 初心者のためよく分かっていないことが多すぎで申し訳ありませんが、アドバイスをいただけますでしょうか。 よろしくお願いいたします。

  • BAT処理でCSVデータのインポート

    よろしくお願いしますm(__)m 昨日から調べて作ってみたのですがうまく動かず、 MYSQLが強制終了してしまうこともありました(T_T) 疲れました・・・ ※test.batに以下の内容を書きました c:\mysql\bin\mysql -u **** -p**** < test.sql ※test.sqlに以下の内容を書きました LOAD DATA INFILE "c:\mysql\test.csv" INTO TABLE 商品管理.商品単品 FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY "" ESCAPED BY "\\" LINES STARTING BY "" TERMINATED BY "\n" ※test.csvはカンマ区切りになっています。 ファイルは【test.bat】【test.sql】【test.csv】とも c:\mysqlに置いています。 この状態でtest.batを実行するとDOS窓が一瞬現れて消えて しまいます。 間違っているところやヒントなどあれば教えてくださいm(__)m

    • ベストアンサー
    • MySQL
  • バッチより実行されるSQLについて

    あるバッチファイルからSQL文を実行します。 SQLの内容を簡単に申し上げますと テーブルAにレコードが1件存在したときは、 テーブルBを削除する。 テーブルAにレコードが2件存在したときは、 何もしない。 バッチファイルには、後続の処理もあるのですが 割愛します。 ここで質問なのですが、レコードが2件存在した とき、バッチの後続処理を実行させずに、そこで 処理終了とさせたいのですが、方法はあります でしょうか? SQL内でバッチのエラーレベルのようなものを 渡せたら、解決できそうなのですが、方法が わかりません。 説明があいまいでわかりにくいかもしれませんが 何か方法がありましたら、教えてください。

  • SQL文に関するとある問題について

    SQL文に関するとある問題について (3) 次の出庫記録の表に対して、以下のSQL文を実行したときに得られる値が 最も大きな数が得られるものは何ですか? 該当する記号を書いてください。 --------------------------------------------------------------- 商品番号 数量 日付 PRT145 4 20090610 DP255 2 20090610 DP266 3 20090611 PRT255 2 20090611 a SELECT MAX(数量) FROM 出庫記録 b SELECT AVG(数量) FROM 出庫記録 WHERE 日付='20090610' c SELECT COUNT(*) FROM 出庫記録 d SELECT SUM(数量) FROM 出庫記録 WHERE 日付='20090611' ------------------------------------------------------------ この場合、それぞれの選択肢が出す数字は a=1 b=3 c=4 d=5 なので、正解はdでいいんでしょうか? aのMAXって、最大なのはPRT145の数量4ですが、a=に4をいれるべきか、それともMAXなのはPRT145一つだけなので1にすべきか、まずそこで躓きました。 bのAVGは4+2=6なので、それの半分の3かな? cはそのまんま4にして dはSUMなんで、3+2=5.にしちゃいましたが、間違ってるでしょうか?   宜しくお願い致します。

  • sql文で現在の時間と比較し期間が来たら削除したい

    すみません、分かる方がいたら教えてほしいです。 現在PHPファイル内に記述されているsql文に修正を加えたいのですが、方法が分かりません。 実装したい内容は、表題の通りで、 現在は以下のコードで動いています。 $sql = "delete from hogehoge where limit_time<=now()"; おそらくデータベースhogehogeで、 今日の日付になれば、limit_timeに該当するテーブルは削除します。 という内容だと思っています。 これを、今日の日付がlimit_timeから2週間後になった時に削除する。 といったように、 削除する時期を変更したい場合は、どのように記述すればよろしいでしょうか? 拙い質問かもしれませんが、ご教授いただければと思います。

    • ベストアンサー
    • MySQL
  • SQLで、指定日条件のSQL文

    MySQLを使っています。 商品テーブルの中で、 同じ商品のレコードが複数あります。 その多数のレコード中に、日付項目があります。 そこから、 1)商品IDで重複せずに、2)指定日に、3)一番近い過去の日、4)指定日を含めて、複数ある未来の全レコード、を抽出するには、 どのようなSQL文を書けばよいでしょうか? 商品でユニークになるように、 1.過去に複数ある日付の中から、指定日に、一番近いレコード。 2.未来に複数ある日付の中の、全ての未来の、レコード。 3.同一商品レコードは、複数抽出されない。

  • SQL(SELECT文)を教えてください

    SQL Serverを勉強中です。 以下のようなテーブルに、同一の日付に複数の名称・値のセットが存在します。 Date(日付)  Name(名称) Value(値) 20130101      a      10 20130101      b      20 20130101      c      30 20130202      a      5 20130202      b      10 20130202      c      15 このデータを、SQLのSELECT文で取得し、以下のような表を作りたいと考えています。 a b c 20130101 10 20 30 20130202 5 10 15 行が日付、列が名称になっています。 このように取得できるSQL文を教えてください。よろしくお願いします。

  • こんなSQL文

    Oracle8.1.7を使用しております。 以下のようなテーブルに対し、1行目と2行目を削除するSQL文を書きたいのですが、思いつきません。どなたか、アドバイスいただけないでしょうか? 表名:A   B | C ――――――――   2 | 10   2 | 1   1 | 10   1 | 1   1 | 11   1 | 2   1 | 1   3 | 10   2 | 3 変数として、P1=1とP2=2があります。(これは、SQL文の中に直接書くものとします。) ここで、SELECT B,C FROM A WHERE B=1;とSELECT B,C FROM A WHERE B=2;を実行すると、次のようになります。   B | C     B | C ――――――――― ―――――――――   1 | 10    2 | 10   1 | 1     2 | 1   1 | 11    2 | 3   1 | 2   1 | 1 ここで、それぞれの表を見ると、Cの値が一致している部分があります。この一致していて、Bが2の行を削除したいのですが、SQL1文では無理でしょうか? 最近、SQLには慣れてきたつもりだったのですが、こんなとこでつまずくとは・・・どうぞよろしくお願いします。

  • MysqlのSQL文について

    AccessとMysqlを用いてデータベースシステムを作成しています。 添付図の左の表から,右の表の品番と枝番が一致するデータを削除する場合(今回はaaaの2と6)は,どのようにSQL文を記述すればよいでしょうか? Do Untilで1行毎に比較して削除する方法では時間がかかり過ぎたため,SQL文で一度で処理できないかと考えたのですが,SQL文をどのように記述すればよいかわかりませんでした... お分かりになられる方がいらっしゃいましたら,ご教授宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • sql文の書き方

    いつもこちらで勉強させていただきます。 環境:mysql5.0 PHP5.1.4 apache 2.0.58 いま画面からパラメータ5受け取りました。 これをもってsql文を書こうとするが必須入力項目ではないため一つずつ判断して書いたら30種類の可能性がでてきてすごく長くなってしまいましたがなんか短縮させるいい方法はありませんか?またこれをファンクションで作り直そうとしたらちょっとうまくいかないのでどなたか教えてもらえませんか?ファンクションで渡すパラメータ($sql?$query?あるいは各パラメータですか? )は何にすればいいか?取得したい検索結果は配列です。ファンクション戻り値を連想配列にすることは可能ですか?ちょっと困っています。 $sql = "SELECT * FROM file_tbl WHERE"; // A だけの場合 if ( $b == "" and $c == "" and $d=="" and $e==""){ $sql = $sql." a='%s' order by b DESC,a"; $query = sprintf("$sql", mysql_real_escape_string($a)); // B だけの場合 }else if( $a == "" and $c == "" and $d=="" and $e==""){ $sql = $sql." b >='%s' order by b DESC,a"; $query = sprintf("$sql", mysql_real_escape_string($b)); // Cだけの場合 }else if( $a == "" and $b == "" and $d=="" and $e==""){ $sql = $sql." c <='%s' order by b DESC,a"; . . . // SQL クエリを実行する $result = mysql_query($query); よろしくご教授願います。

    • ベストアンサー
    • MySQL