• ベストアンサー

AC2000のクエリで重複データから最新のデータだけ抽出したいのですが・・・(2)

OSWINDOWS98SE AC2000 こんにちは、前回「AC2000のクエリで重複データから最新のデータだけ抽出したいのですが・・・」と言う質問をさせていただいて、教えていただいたSQLを使って色々とやってみたのですがどうしても2番のところで クエリ式'[主索引] delete 既存データA.* from 既存データA inner join 一時テーブル   on 既存データA.主索引 = 一時テーブル.主索引 insert into 既存データA(主索引,更新回数) select 更新データB.主索引'の構文エラー:演算子がありません。 と言うコメントがでてしまいさきに進むことが出来なくなってしまいました。 構文エラー?演算子がありません??他を探してみたのですが乏しい知識の範囲では解決を見つけることが出来ずまた、質問させていただいた次第です。 1番の一時テーブルは作成できるのですが、2番以降がうまくいきません どうかご教授お願いいたします。 1.更新データBから一時テーブルの作成 2.更新されているデータを予め削除する 3.既存データAへ追加データ、更新データをinsert 前回の質問 http://oshiete1.goo.ne.jp/kotaeru.php3?q=155505

  • tokin
  • お礼率67% (38/56)

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

  • ベストアンサー
  • stork
  • ベストアンサー率34% (97/285)
回答No.2

アクセスだと結合されたテーブルのデータを削除することは出来ないみたいですね。(汗) tokinさんすみません。確認不足でした。 #アクセスのこの仕様おかしくないかな? #どなたか詳しくご存知の方フォローしてください 別の方法で行きましょう。 >1.更新データBから一時テーブルの作成 >2.更新されているデータを予め削除する >3.既存データAへ追加データ、更新データをinsert 1.はそのまま 2.更新されたデータを「UPDATE」 3.追加データをinsert SQLは、 2.データの更新 UPDATE 既存データA INNER JOIN 一時テーブル     ON 既存データA.主索引 = 一時テーブル.主索引 SET 既存データA.更新回数 = [一時テーブル].[最終更新],.... 3.新規データの追加 INSERT INTO 既存データA ( 主索引, 更新回数...) SELECT 更新データB.主索引, 更新データB.更新回数... FROM 更新データB LEFT JOIN 既存データA    ON 更新データB.主索引 = 既存データA.主索引 WHERE (((既存データA.主索引) Is Null)) ※主索引が更新データBにあって、既存データAにないものを追加しています。 ご迷惑をおかけして済みませんでした。

tokin
質問者

お礼

storkさんありがとうございます。 >ご迷惑をおかけして済みませんでした。 いえいえとんでもありません、こちらこそ無理を言いまして申し訳ありません。 感謝しております。 いただいた回答早速実行してみます。 本当にありがとうございます。

その他の回答 (1)

  • yanmaa
  • ベストアンサー率45% (207/457)
回答No.1

言葉定義は前回の質問と回答を尊重して 0:更新データBをクリアします。 クエリー名:Q0 DELETE 更新データB.* FROM 更新データB; 1:Bのファイルを更新データBにインポートします。 2:更新データBから一時テーブルを作成します。 クエリー名:Q1 SELECT 更新データB.主索引, Max(更新データB.更新回数) AS 更新回数の最大 INTO 一時テーブル FROM 更新データB GROUP BY 更新データB.主索引; 3:一時テーブルと既存データAを比較し、一時テーブルしかない場合と更新データBの更新回数が大きい主索引一覧を作成します。 クエリー名:Q2 SELECT 一時テーブル.主索引, 一時テーブル.更新回数の最大 INTO 一時テーブル2 FROM 一時テーブル LEFT JOIN 既存データA ON 一時テーブル.主索引 = 既存データA.主索引 WHERE (((一時テーブル.更新回数の最大)>[既存データA].[更新回数])) OR (((既存データA.主索引) Is Null)); 4:既存データAから不要なデータを削除する。 クエリー名:Q3 DELETE 既存データA.*, 既存データA.主索引 FROM 既存データA WHERE (((既存データA.主索引) In (SELECT 一時テーブル2.主索引 FROM 一時テーブル2))); 5:更新データBから追加が必要な分のみを追加する。 クエリー名:Q4 INSERT INTO 既存データA SELECT 更新データB.* FROM 更新データB INNER JOIN D ON (更新データB.主索引 = D.主索引) AND (更新データB.更新回数 = D.更新回数の最大); この6段階の作業を行えば出来るはずです。 注意:アクセスを起動してからデータインポートそして更新作業まで含みました。 これを自動化する場合はマクロなり、VBAなりで対応してください。 なお番号1つに対して1つの命令(マクロなら行)が必要になります。 という事で5つのクエリーが必要ですね。 取り合えずざっくりとサンプルを作ったので動くとは思うのだけど間違っていたり、分からないことがあれば補足してください。 ところで前回のstorkさんの回答では、既存データAの方が更新回数が大きい場合の処理が抜けていましたので追加しています。

tokin
質問者

お礼

yanmaaさん早速のご回答ありがとうございます。 また、丁寧な説明で初心者の私にはとても助かります。 常に学習精神を忘れずに、早速やってみたいと思います。

関連するQ&A

  • AC2000のクエリで重複データから最新のデータだけ抽出したいのですが・・・

    Windows98Access2000です。 下記のようなテーブルを元にしたクエリがあります。 主索引(主キー)|手配番号 |行番号|更新回数|発行日 |販売先|・・・ 0101023456  |0101023456|  56|   1|19990301|A001 |・・・ 0101034567  |0101034567|  67|   3|20000503|A235 |・・・    ・       ・     ・   ・   ・    ・ 仮に既存データをA、更新データ(TXT)をBとします。 (更新データは毎朝TXTで決まったフォルダーに落ちてきます。) 同じ項目の更新データBを、下記の条件で最終的に既存データAに新規追加、 上書したいのです。 1.更新データBの主索引は主キーにはなっておらず番号がダブっています。   ただレコードごとに「更新回数」項目に1や2といった番号が入ってますので   、その中から同じ主索引番号がある場合更新回数の一番大きな番号だけを抽出   したい。 2.1で抽出した更新データBを今度は、既存データA(主索引は主キー)に追加す   るのですが、上記と同じくすでに重複する主索引番号が存在する場合A、Bデー   タの「更新回数」項目を見て一番大きい番号を反映(上書)させたい。 2の既存データに追加だけは追加クエリを作り重複しないデータは追加することが 出来るのですが、重複しているデータは「XX件の重複データが・・・」とでて 追加することが出来ません。(あたりまえですかf^^;) ちょっとわけのわからない説明になってしまいましたのでやりたいことを簡単に いいますと、更新データから既存データへ主索引がダブることなく毎朝送られて くる最新データをテーブルに取り込みたいということなのです。 ちょっと思ったのですが、もしかして私は抽出条件式が分かってないだけなので しょうかf^^; おかしな質問で申し訳ありませんが、ご指導の程よろしくお願い致します。

  • ACCESS2000の重複クエリ

    よろしく、お願いします。 ACCESS2000+Win2000で使用しています。 ACCESS2000の”テーブルA”の”フィールドa”の”重複クエリ甲”の結果としてX、Y、Zというデータが出たとします。 そのうち、XのみにテーブルAの”フィールドb(Yes/No型)”にフラグを立てたいのですが、良い方法はありませんか? 私は重複クエリ甲に、更新クエリで更新する事は出来ませんよね? 甲と同じく”重複クエリ乙”を作って、乙は”集計”で先頭のみを出して、甲と乙の”不一致クエリ”で差分を出してみたりもしたのですが、更新クエリを使えない為に、フラグを立てられません。 何か良い方法を教えてください。 お願い致します。

  • クエリでのデータ更新について

    ACCESS2000で更新クエリの質問です。 フィールドの値の合計、カウントなどの集計値を計算するクエリから取り出された値を、更新クエリでデータを更新したいのですが、 「更新可能なクエリでありません」とエラーがでます。 LOOPする方法もあるのですが、できればクエリで一括更新したいと思います。 どなたかご教授お願いします。 やりたいことは下記のとおりです。Aテーブルを集計しBテーブルの個数にAテーブルの個数の合計値を更新する。 <Aテーブル> コード  個数 1     1 1     2 1     3 2     4 2     4 3     5 3     6 <Bテーブル> コード  個数 1      2      3    ↓↓↓更新後 <結果:Bテーブル>   コード  個数 1     6 2     8 3     11

  • アクセス2010 最新データを抽出する方法

    はじめまして。 アクセスを猛勉強中の初心者です。 過去記事を探しましたが、解決できませんでしたのでご教示お願いします。 やりたいことは、2つのテーブルからクエリを使って、最新のデータを抽出したいです。 ですが、その中に抽出したくないワードが存在します。 それ以外のワードで最新のデータを抽出したいです。 まず、下記のような2つのテーブルがあります。 ●テーブル1        ・ID(主キー)       ・日付 ・コメント ・顧客ID ●テーブル2 ・顧客ID(主キー) ・顧客名 ・住所 次にこのテーブルをクエリにしてデータを返すと、下記のようになります。 日付    コメント      顧客名    ・2/1     保留       Aさん ・2/1     発送       Bさん       ・2/1     相談       Cさん ・2/2    次回未定     Bさん ・2/3     発送       Aさん  ・2/4    次回未定     Dさん        今回抽出したいデータは、「発送」というワードをはぶいた最新のデータをとりたいということです。 なので、データとしては、 日付    コメント      顧客名    ・2/1     保留       Aさん ・2/1     相談       Cさん ・2/2    次回未定     Bさん ・2/4    次回未定     Dさん と、このように抽出したいのです。 最新データの抽出にはMax関数を使ってでき、いらないワードである「発送」はクエリのフィールドの抽出条件に『<>”発送”』と入力することで抽出を防ぐことができたのですが、これらの方法でMax関数を入れて最新データの抽出をしようとすると、全ての「発送」を除いたデータが抽出されるので、最新データに該当する顧客のデータが消えてしまいます。 なので、本来のコメントデータが分からない状態になります。 また、エクセル側でパラメータクエリを使って資料を作成し、アクセスに触ったことがない人たちが使用するので、アクセスを更新してといったことができません。 なので、更新クエリなどを使ってのやり方以外の方法はないでしょうか? 全くの初心者ですので、言葉足らずで説明が分かり辛くて申し訳ありません。 ご教示をお願いいたします。

  • 更新クエリがわからない

    windows-xp、Access2003を使っています。 参考書に載っている更新クエリは「同一のテーブル内でデータを更新する」という内容で載っているのを見ました。 が、そうではなく・・・ 更新クエリを作成すると「レコードの更新」という欄が出てくるのですが、そこに、別のテーブルや別のクエリのデータを”ビルド”で作成することはできないのでしょうか? 試みたのですが、”パラメータの入力”というものが出てきてしまいました。 ついでにおわかりになれば、これも教えてください。 ↓↓↓ テーブルAとテーブルB(或いはクエリB)に、同じIDをもつデータがあります。そこで、テーブルAの指定するフィールドへ、テーブルBの新しいデータを入れ込みたい(更新)させたい。 すみませんが、宜しくお願い致します。

  • TXTデータを既存の、Access2000のテーブルへインポートしたいのですが・・・

    OSはWindows98SE SoftはAccess2000です。 現在Accessに、約5000件くらいの既存データがあります。(主キー:主索引) -----------------------------------------------------------------  主索引| 発注番号| 発注日 |担当者|販売先|商品番号|商品名・・・   ----------------------------------------------------------------- 00000001|0000000111|20011001| 03 |1001| A001 |ボイド 00000002|0000000222|20011005| 05 |1003| B004 |塩ビパイプ   ・     ・     ・     ・   ・    ・    ・   ・     ・     ・     ・   ・    ・    ・ そこへ約50件くらいのTXTデータを新しく追加及び、既存データに対して追加変更があったデータに修正(上書き)をしたいのですがどなたか教えていただけないでしょうか。 自分なりに、更新クエリを使ってみたり、VBの本を読んだりしたのですがよくわからず悩んでいます。。 何かヒントとなるものでも結構です。 説明が下手で申し訳ありませんがどうぞよろしくお願い致します。

  • Accessのクエリでフィールドの一番大きな数字を抽出させるには?

    OSはWin98SE Access2000です。 多分簡単なことなのかもしれないのですが、追加クエリの抽出条件を使って、 その列(更新回数)でいちばん大きな数字のみ別テーブルに抽出(追加)させたいのですがその式がわからず悩んでいます。 例(主キーなし) 店番号|商品番号|更新回数|金額|・・・ 001 |A021  |  2 |300 |・・・ 002 |A034  |  1 |200 |・・・ 001 |A122  |  1 |150 |・・・ 001 |A043  |  3 |500 |・・・ 上記で店番号001が3データ入っている中の更新回数が3のデータのみ別のテーブルに追加したいのですが、最大を求めるのでMaxやDMaxを使用したらよいのかな?などと思ったのですが、その先の式の書き方がわからないのでどなたか教えていただけませんか。 どうぞよろしくお願いします。

  • クエリーで全部のデータを抽出する方法

    アクセスのクエリーでデータを抽出する時、具体的にはフォームでデータを入力し抽出するのですが、たとえばフォームのテキストボックスに数字を入れないとそのクエリーのフィールドは抽出がかからないようにしたいのです。(抽出フィールドが1つなら数字をいれなければクエリーのデータすべてが表示される) ----------------------------------- フィールド   A      B     c テーブル   テーブル1 テーブル1 テーブル1 抽出条件    []    [] または    ---------------------------------- 上はクエリーのデザインですがクエリーをひらくと抽出条件をきいてきますがA列は何も入力しないでB列では1と入力するとBの列に1の入ってるレコードを表示させたいのです。(もし空欄が無理ならAの列の時何かある文字を入力すると全部表示になる、でもいいです。) まわりくどくなりましたが、アクセス超入門者です。よろしくおねがいします。

  • Insert Into Select での重複について

    DB:SQLServer2000 こんにちは お世話になっております。 トランザクションのテーブルA から ワークのテーブルBへInsert Into Select を使用してデータを格納しているのですが、その際に重複が発生してしまいます。 テーブルA 主キーあり テーブルB 主キーなし Delete B Insert into B select 項目1,項目2,・・・ from A With(Nolock) where 日付項目 = 20080101 テーブルAの主キー項目は全てテーブルBへInsertしており、Insert完了後のテーブルBの中身を見ると、まれに全く同じデータが2件出来ていることがあります。 このInsert into selectが実行されている間に、テーブルAに対して登録更新が行われることもあります。 色々と試してはいるのですが、原因が特定できずに困っております。 もし何かお気づきになられる方がいらっしゃいましたら、ご教示下さい。 よろしくお願い致します。

  • クエリ上でのデータ更新

    Accessのクエリで、クエリ実行した画面の抽出されたデータ上で、データの書き換え・更新ができるクエリと、「このレコードセットは更新できません」と左下に記載されてしまい更新できないクエリがありますが、この2つにはどんな違いがあるのでしょうか? おそらく、元になっているテーブルの何かの設定が違うのだろうかと思うのですが、それがよくわかりませんので投稿しました。 よろしくお願いいたします。