• ベストアンサー
  • すぐに回答を!

バッチ処理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
  • 閲覧数1326
  • ありがとう数5

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • 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で、指定日条件のSQL文

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

  • MysqlのSQL文について

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

    • ベストアンサー
    • MySQL

その他の回答 (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); で、変数より一ヶ月前より小さいか等しい値を削除しています。 これでいかがでしょうか?

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.1
  • 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です。 よろしくお願いします。

関連するQ&A

  • SQL文を教えて下さい

    VB2008、SQL Server で開発をしています。 下記の条件でデータを取得したいのですが、SQL文がうまくできず、困っています。 おわかりの方、教えてください。 仕様:得意先マスタ(得意先M)の全件と、売上テーブル(売上T)を読みます。     売上テーブルの商品コードの商品名を商品マスタ(商品M)より取得します。     得意先マスタの全得意先を取得する必要があります。     すべての得意先の売上データが存在するわけではありません。 ACCESS上でクエリを作成し、SQLビューにすると、こうなります。 inptSyoCD:画面から入力した商品コード 1,まず、クエリ1: SELECT 売上T.伝票日付, 売上T.伝票番号, 売上T.得意先コード, 売上T.明細区分, 売上T.商品コード, 商品M.商品名称 FROM 売上T LEFT JOIN 商品M 売上T.商品コード = 商品M.商品名 WHERE 売上T.明細区分=1 AND 売上T.商品コード= inptSyoCD ; 2,次に、実際に処理するSQL文: SELECT 得意先M.得意先コード, 得意先M.得意先名称,       クエリ1.伝票日付, クエリ1.伝票番号, クエリ1.明細区分, クエリ1.商品コード, クエリ1.商品名  FROM 得意先M LEFT JOIN クエリ1 ON 得意先M.得意先コード = クエリ1.得意先コード ORDER BY 得意先M.得意先コード,売上T.伝票日付,売上T.商品コード; この2つをひとつのSQL文にする方法がわかりません。 よろしくお願いいたします。

  • PHP+MySQL SQL文を外部ファイル化したい。

    表題のとおりなのですが… $result = mysql_query( "SELECT * FROM FOO" ); では、動作しています。 このセレクト文を、selectFOO.sql として外部ファイル化し、 (ファイルの中身は、「SELECT * FROM FOO」) $result = mysql_query( selectFOO.sql ); とすると、 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'selectFOO.sql' at line 1 が返ってきます。 SQL文が正しくないよ。マニュアル見てね。 と言われてるのは分かるのですが、 マニュアルのどこを見れば良いのかさえ分かりません。 助けてください。 よろしくお願いします。

    • 締切済み
    • PHP
  • SQL文で右から1文字だけ削除するやり方

    MySQL 5.1 利用中です。 テーブルに登録されている文字列が以下のようになっている場合 右から1文字だけを削除するSQL文を教えてください 右から「部とか課や/」が削除されるイメージです。 →SQL実行前 name 経理課 営業部 開発部 部門開発部 RアンドD/ →SQL実行後 name 経理 営業 開発 部門開発 RアンドD よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • SQL文でのデータの取得が上手くいきません

    初めて質問させていただきます。 こちらのカテゴリで良いのか分からなかったのですが、よろしくお願いいたします。 SQL文を作成しているのですが、上手くいかず困っている状況です。 要件としてはテーブルAにユーザーの情報が格納されているのですが、 キーの一つとして世代(SEDAI_NO)(日付)を持っております。 今回取り出したいデータは該当ユーザーの処理日以前の最新のデータを 取得したいと思い以下のSQL文を作成しましたが、上手く行かず、最新世代を含むそれ以前の世代のデータを取得してきています。 どこがおかしいのでしょうか? よろしくお願いいたします。 【作成したSQL】 select * from テーブルA テーブルA’ where (USER_ID=該当のユーザーID) and (SEDAI_NO = (select max(SEDAI_NO) from テーブルA where SEDAI_NO = テーブルA’.SEDAI_NO AND 処理日 >= テーブルA'.SEDAI_NO)

  • batファイルからsql文実行

    クライアントOS:WIN2000 Oracle:9i(サーバ(UNIX)上にあります) 現在、クライアントからbatを起動し、SQL文を投げ、結果を取得したいと思っております。 (SQL文は単純にTBLをカウントしているだけです) ・batの中身 sqlplus %UID%/%PASS%@%SID% @test.sql > output 結果は取得出来るのですが、余分な情報も結果に出力されてしまいます。結果のみを出力させるにはどうすればよろしいでしょうか? ・余分な情報 Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production With the Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.4.0 - Production に接続されました。

  • MySQL の設定で行き詰っております・・・。

    こんにちは。 ある海外のフリーソフトをサーバーにインストールしようとして、行き詰っております。宜しくお願い致します。 そのソフトは、MySQLのデータベースを必要とします。 私は今までMySQLのデータベースを使った事はあるのですが、データベースさえ作ればその他は自動的にやってくれるものばかりだったので、今回手動(?)で分からなくなっております。インストールの説明文に次のようにあります。[5]までは済ませています。 ----------------------------------------------- [5] Create the mysql database (usually tinylink) with mysqladmin. mysqladmin -u<your_mysql_user> -p<your_mysql_pass> create tinylink (tinylink というのはソフトの名前なので、データベースの名前も通常その名前だという説明だと思います。mysql admin を使ってここまではできました。) [6] Create the mysql tables. You have 2 options : 1) mysql -u<your_mysql_user> -p<your_mysql_pass> tinylink < db_structure.sql 2) use phpMyAdmin to run the SQL file 'sql/db_structure.sql' ここがわかりません。(1)でも(2)でも良い、という事なのですが、(1)は私には意味が不明です。(特に tinylink < db_structure.sql の部分が不明) (2)はphpMyadminを使って、テーブルの作成に次のファイル('sql/db_structure.sql')を実行するように設定してね、という意味だと思うのですが、phpMyAdminのどの部分でファイルを実行するように設定できるのかが不明です。 "db_structure.sql'"ファイル自体はすでにアップロードしてあるのですが・・・。 なにぶん分かっていない事が多いのでちんぷんかんぷんな事を言っているかも分かりませんが、どうぞお手柔らかに宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • データベースを作りたいのですが初心者でして・・・

    はじめまして 今、アパレルのショップの商品管理にエクセルをつかっているのですが sqlで管理しようかと考えています、 そこでmysqlをインストールしようといろいろ検索していると、 postgresqlというのを見つけました、mysqlとどう違うのでしょうか?オラクルとはまた別のものですか? また、商品管理にsqlは向いていないでしょうか? ほかに、使ったほうがいいものがあれば教えていただけないでしょうか?

  • SQL文で2つのSELCT文の結果を繋げる方法

    SQL文で2つのSELCT文の結果を繋げる方法はありますでしょうか。 Left Join でもと思ったのですが、片側にしかないのも、1レコードとして出力したいです。 テーブルの例と出力の理想は以下です。 また、上記の応用でこれを4テーブル(SELECT文)を繋げて、下記例で言うと、日付と商品コードがキーで、どのテーブルに存在しても、結果を1行で返せるでしょうか。 【テーブル1(SELECT文1)】 F_仕入 伝票日付 商品コード 仕入金額 2014/07/01 101     10,000 2014/07/02 102     15,000 2014/07/05 104 20,000 【テーブル2(SELECT文2)】 F_売上 伝票日付 商品コード 売上金額 2014/07/01 101     15,000 2014/07/02 102     25,000 2014/07/03 103 13,000 上記2つのSELECT結果 伝票日付  商品コード 仕入金額 売上金額 2014/07/01 101 10,000 15,000 2014/07/02 102 15000 25,000 2014/07/03 103 13,000 2014/07/05 104 20,000 よろしくお願いします。

  • 1つのsql文でデータを取得したい

    phpとmysqlを連携させデータを取得しています。mysql5です。 現在は2つのテーブルからデータを取得するため以下のように2回のsql文を発行しています。 $sql = 'SELECT products_id, name, products_flag, comment1, IF("' . $products->beforedays . '" < DATE(create_date), "1", "0") as new, FROM products WHERE status = ? AND del_flg = ? ORDER BY create_date DESC'; // 1回目のsqlで取得したproducts_idを参照し下記のsqlを実行 $sql = 'SELECT MIN(price1) as min_price1, MAX(price1) as max_price1, MIN(price2) as min_price2, MAX(price2) as max_price2, IFNULL(price2, price1) as price0, stock FROM products_class_detail WHERE products_id = ?'; これを1回のsqlにまとめる場合どのような書き方になるでしょうか? 自分なりに下記のようにしてみたところ動作はするのですが複数のデータが条件に 当てはまるはずがminとmaxがあるためか条件に当てはまる最後のデータのみしか 取得されませんでした。 ※試しにmin,maxを外すと複数のデータを取得できました。 $sql = 'SELECT products.products_id, products.name, products.products_flag, products.comment1, IF("' . $products->beforedays . '" < DATE(products.create_date), "1", "0") as new, MIN(products_class_detail.price1) as min_price1, MAX(products_class_detail.price1) as max_price1, MIN(products_class_detail.price2) as min_price2, MAX(products_class_detail.price2) as max_price2, IFNULL(products_class_detail.price2, products_class_detail.price1) as price0, products_class_detail.stock FROM products, products_class_detail WHERE products_class_detail.products_id = products.products_id AND products.status2 = ? AND products.del_flg = ? ORDER BY' . $where_sql; 商品の情報を取得するsqlで最後のorder句は商品の並び順の変更でユーザーの指定した 順番(新着順や価格順等)で表示するためのものです。 2回のsqlの場合は問題なく動作していたのですがで新着順や価格順に並び替えを行うため 1回のでsqlで行いたいと思っております。 新着順の場合は1回目のsqlに条件が入るので問題ないのですが価格順の場合は2回目の sqlに条件が入るので2回のsqlではうまく並び替えができませんでした。 ソースの短縮にもなり可能であれば1回のsqlで完結させたいのですがどうすればいいものか わからずつまづいております。 詳しい方がいらっしゃいましたら宜しくお願い致します。

  • updateのsql文について

    mysql5.0です。 いかのsql文のなかdistrb_date項目にシステム日付を代入させたいですが書き方がわからなくて困っています。よろしくお願いします。 UPDATE file_tbl SET status = 2, distrb_date = (???), user_id = %s where file_name = %s AND file_type = %s order by file_ymd DESC

    • ベストアンサー
    • MySQL