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

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

A 回答 (2件)

<br /> アクセスだと結合されたテーブルのデータを削除することは出来ないみたいですね。(汗)<br /> 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にないものを追加しています。

ご迷惑をおかけして済みませんでした。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/11/01 18:44

<br /> 言葉定義は前回の質問と回答を尊重して<br /> <br /> 0:更新データBをクリアします。<br />

更新データ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の方が更新回数が大きい場合の処理が抜けていましたので追加しています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/11/01 18:38

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