OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • 困ってます
  • 質問No.161189
  • 閲覧数428
  • ありがとう数3
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 67% (38/56)

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
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル11

ベストアンサー率 34% (97/285)


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

お礼率 67% (38/56)

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

その他の回答 (全1件)

  • 回答No.1
レベル12

ベストアンサー率 45% (207/457)

言葉定義は前回の質問と回答を尊重して 0:更新データBをクリアします。 クエリー名:Q0 DELETE 更新データB.* FROM 更新データB; 1:Bのファイルを更新データBにインポートします。 2:更新データBから一時テーブルを作成します。 クエリー名:Q1 SELECT 更新データB.主索引, Max(更新データB.更新回数) AS 更新回数の最大 INTO 一時テ ...続きを読む

言葉定義は前回の質問と回答を尊重して

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

お礼率 67% (38/56)

yanmaaさん早速のご回答ありがとうございます。
また、丁寧な説明で初心者の私にはとても助かります。
常に学習精神を忘れずに、早速やってみたいと思います。
投稿日時 - 2001-11-01 18:38:40
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ