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^^;
おかしな質問で申し訳ありませんが、ご指導の程よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>クエリー結果をファイルに出力(1)


 先に結果ファイルを作成します
>グループ化をするとはどういう処理を言うのでしょうか?
 クエリー→新規作成→デザインビュー→OK
 テーブル→テーブルを選択→追加→閉じる
 主索引(主キー)と更新回数をダブルクリック
 Σキークリック
 更新回数の集計をクリックし最大を選択
 更新回数の並べ替えをクリックし昇順を選択
>クエリー結果をファイルに出力(2)
 一番上のクエリー→追加→結果ファイルを指定((1)で作成したもの)
です。がんばって下さい。
何かあれば補足して下さい。
但し次回は朝になります。ご了承下さい。
 
 
 
    • good
    • 0
この回答へのお礼

k_ebaさん親切に手順を踏んでの説明有難う御座います。
とても分かり易く感謝いたします。
万一、うまく出来ないときはまた質問させてください。
どうぞよろしくお願い致します。
有難う御座いました。

お礼日時:2001/10/22 18:30

更新データBは主索引+更新回数で重複しない値になります。

主索引ごとの更新回数の最大を取得して、どうのこうのやればいいわけです。

1.更新データBから一時テーブルの作成
select 主索引,max(更新回数) as 最終更新
into 一時テーブル
from 更新データB
group by 主索引

2.更新されているデータを予め削除する
delete 既存データA.*
from 既存データA inner join 一時テーブル
   on 既存データA.主索引 = 一時テーブル.主索引

3.既存データAへ追加データ、更新データをinsert
insert into 既存データA (主索引,更新回数.....)
select 更新データB.主索引,更新データB.更新回数...
from 更新データB inner join 一時テーブル
   on (更新データB.主索引 = 一時テーブル.主索引)
     and (更新データB.更新回数 = 一時テーブル.更新回数)

と言った感じですかね。
    • good
    • 0
この回答へのお礼

storkさん回答有難う御座います。
SQLは良く分からないのですが、このSQLは更新データBの方に記述してやると良かったでしょうか。
早速やってみたいと思います。
ありがとうございます。

お礼日時:2001/10/22 17:46

まず考え方ですが


1つのファイルをクエリー等で選択してどのこうのとやる場合
クエリーを続けると上手く動作をしないことが多々あります。
それの解決策ですが、クエリー結果をファイルに出力し
それを元に処理をする方法がゆうこうです。

さて1)の方法ですが
主キーと更新回数だけのクエリーで
主キーをグループ化し
更新回数を集計、最大、昇順でファイルを作成してから
実行された方が良いと思います。
がんばって下さい。
    • good
    • 0
この回答へのお礼

早速の回答有難う御座います。
>クエリーを続けると上手く動作をしないことが多々あります。
クエリはあまり重ねて使わないほうが良いということですね。

知識が乏しくて申し訳ありませんが、
>クエリー結果をファイルに出力しそれを元に処理をする方法
と、グループ化をするとはどういう処理を言うのでしょうか?
ご指導いただけたら幸いです。
よろしくお願い致します。
また、早速やってみます。

お礼日時:2001/10/22 17:15

このQ&Aに関連する人気のQ&A

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

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccessの追加クエリで既存のテーブルに上書き追加をしたい

追加クエリを使用して既存テーブル(マスタテーブルとして使用)に「情報追加+変更箇所上書き」の作業をしたいと思うのですが、型変換エラー(キー違反)となってしまします。解決方法をご存知の方がおられましたら、ご教示願えればと思います。

Aベストアンサー

既存のキーをレコードの追加はできません。
存在する部分は、更新クエリーで処理します。
存在しない場合は、追加クエリーで追加します。
追加クエリーの対象は、不一致クエリーで対象を把握できます。

QAccessの追加クエリの方法(重複データをオートナンバーでキー作成)

Access2003使用

追加クエリを使い、キー設定してあるフィールドにデータを追加していきたいのですが、重複しているデータがあるのでこの重複しているフールドは追加先のオートナンバーフィールドで振られる番号を追加して追加したいと思います。

元データ
番号  商品  金額
123-222 だんご 100
123-223 アイス 200
123-222 だんご 150

追加先データ
番号  商品  金額 オートNO
123-333 赤飯  100  1
123-444 ご飯  200 2
123-555 五平餅 150 3
123-222/4 だんご 100 4
123-223  アイス 200 5
123-222/6 だんご 150 6
とやりたいのですが、良い方法は無いでしょうか?
よろしくお願いします。

Aベストアンサー

このオートナンバーを使うのは、決定した仕様でしょうか。
私が考えれる範囲では、かなり厳しい仕様なのでは、と思ってしまいます。

番号  商品  金額 オートNO
123-333 赤飯  100  1
123-444 ご飯  200 2
123-555 五平餅 150 3

ここに

番号  商品  金額
123-222 だんご 100
123-223 アイス 200
123-222 だんご 150

を追加したら、

番号  商品  金額 オートNO
123-333 赤飯  100  1
123-444 ご飯  200 2
123-555 五平餅 150 3
123-222/4 だんご 100 4
123-223  アイス 200 5
123-222/6 だんご 150 6

に、ということですよね。

さらに

番号  商品  金額
123-222 だんご 100
123-223 アイス 200
123-222 だんご 150

を追加したらどうなるのでしょう。

番号  商品  金額 オートNO
123-333 赤飯  100  1
123-444 ご飯  200 2
123-555 五平餅 150 3
123-222/4 だんご 100 4
123-223  アイス 200 5 ←ここも書換え?
123-222/6 だんご 150 6
123-222/7 だんご 100 7 ←?
123-223/8 アイス 200 8 ←?
123-222/9 だんご 150 9 ←?

オートナンバーは、レコードを登録した際に確定する数値だった(?)と思うので、
1度仮の番号で登録、
オートナンバー値を取得、
重複番号をチェックし、
加工した番号で更新
以前のオートナンバーなし番号に対して更新処理+α
(α:他のテーブルデータの書き換えもあり?)
というような流れになるのかもしれません。
VBAでの記述になるのでしょうか。


以下のような変更では?

番号  細番 商品  金額
123-333 1  赤飯  100
123-444 1  ご飯  200
123-555 1  五平餅 150
123-222 1  だんご 100
123-223 1  アイス 200
123-222 2  だんご 150
123-222 3  だんご 100
123-223 2  アイス 200
123-222 4  だんご 150

「細番」は、番号が重複した際の数値
追加時に、番号がなかったら、細番=1
あったら、細番=Max(細番)+1 (その番号での細番最大値+1)
IIF で DLookup や DMax を使えば、クエリでもできると思います。

番号と細番で、主キーとするのでしょうか。

※ 何に使うテーブルなのかわからないので、これがいいのかわかりません。


識者の回答を待って下さい。

このオートナンバーを使うのは、決定した仕様でしょうか。
私が考えれる範囲では、かなり厳しい仕様なのでは、と思ってしまいます。

番号  商品  金額 オートNO
123-333 赤飯  100  1
123-444 ご飯  200 2
123-555 五平餅 150 3

ここに

番号  商品  金額
123-222 だんご 100
123-223 アイス 200
123-222 だんご 150

を追加したら、

番号  商品  金額 オートNO
123-333 赤飯  100  1
123-444 ご飯  200 2
123-555 五平餅 150 3
123-222/4 だん...続きを読む

Q重複なしのフィールドにつき、重複データ挿入時上書きする設定は?

こんにちは。
主キーないしユニークキーなどで、
重複しない設定にしたフィールドで、
重複データを入力されたとき、
入力できないのではなく、上書きされる、
設定にしたいのですが、
どのような方法が、あるでしょうか。
(いちいち、古いデータを削除しなければ、
ならないのでしょうか。)
お願いします。

Aベストアンサー

こういう事情は最初に説明しなきゃ
あるテーブルの値で既存のテーブルを書き換えたいのなら更新クエリです

INSERじゃなくUPDATEね

既存テーブルと書き換えデータを持ったテーブルを
クエリデザインビューに取り込み、主キーで結合
既存テーブルから主キー以外を取り出し
更新クエリに変えて、レコードの更新欄に書き換えデータテーブルのフィールドを指定します

QAC2000のクエリで重複データから最新のデータだけ抽出したいのですが・・・(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

OSWINDOWS98SE
AC2000

こんにちは、前回「AC2000のクエリで重複データから最新のデータだけ抽出したいのですが・・・」と言う質問をさせていただいて、教えていただいたSQLを使って色々とやってみたのですがどうしても2番のところで

クエリ式'[主索引]
delete 既存データA.*
from 既存データA inner join 一時テーブル
  on 既存データA.主索引 = 一時テーブル.主索引

insert into 既存データA(主索引,更新回数)
select 更新データB.主索引'の構文エラー:演算子がありません。

と言うコメン...続きを読む

Aベストアンサー


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

#アクセスのこの仕様おかしくないかな?
#どなたか詳しくご存知の方フォローしてください

別の方法で行きましょう。
>1.更新データBから一時テーブルの作成
>2.更新されているデータを予め削除する
>3.既存データAへ追加データ、更新データをinsert
1.はそのまま
2.更新されたデータを「UPDATE」
3.追加データをinsert

SQLは、
2.デ...続きを読む

Qデータベースの索引

oracle masterの問題関連で質問があります。
一般的にデータベースで
CREATE INDEX myind ON mytbl(a,b,c)
と索引を作成した場合に
SELECT a FROM mytbl ORDER BY a;
この場合myindの索引は使用されるのでしょうか?

Aベストアンサー

#3です。

>ご指摘の通りorder byでは索引されないのですね。
私はそんなことはいっていませんよ。
参考URLはご覧になりましたか?

こちらの「Order By句の使用」のところにも同様のことが書かれています。
http://www.int21.co.jp/pcdn/oracle/article/optimizer.html

「Order By句では、表にNot Null指定されてる場合に限り索引が使用されます」
ということではないですか?
今、手許にOracleがないのでテストしていませんので自信ありとはしませんが。

参考URL:http://www.int21.co.jp/pcdn/oracle/article/optimizer.html


このカテゴリの人気Q&Aランキング

おすすめ情報