マスタファイル2万件、トランザクションファイル約50件程度のデータベースがあります。
50件のデータを1件1件マスタから検索し(キーは2つ)、あればマスタを修正し、なければマスタに追加するプログラムを作成する場合、どういった方法が良いのでしょうか?
1.Do until トランザクション.eof
クエリの実行(約50回)
loop
2.Do until トランザクション.eof
findで検索(約50回)
loop
3.2つともレコードセットを開いて上から順番に検索していく。
分かりづらかったらすみません。方法はこれ位しか思い浮かびませんでした。
ほかにあれば教えて下さい。
1の方法がプログラム的には一番楽なのですが、実行スピードは3なのでしょうか?
すみませんがご教授お願いします。
No.1ベストアンサー
- 回答日時:
まず参考になる質問を一つ(続き物なので2つ上げています)を見てみてください。
http://www.okweb.ne.jp/kotaeru.php3?q=155505
http://www.okweb.ne.jp/kotaeru.php3?q=161189
で前置きはこの程度として
まずトランザクションデータが格納されているファイルをワークテーブルに挿入して
1.マスタテーブルとワークテーブルでキー項目で結合して更新が必要な部分更新する。
2.ワークテーブルにあってマスタテーブルに無いキー項目をもつレコードを抽出(不一致クエリーの応用)
3.2の結果を追加クエリーでマスタテーブルに追加
という方法もありますね。
No.2
- 回答日時:
3の「2つともレコードセットを開いて上から順番に検索していく。
」というのはトランザクションを読んでFindかSeekでマスタを検索するっていうやり方でしょうか?でしたら一番遅いと思います。マスタの方が2万件ということでしたらOpen時だけでも時間かかると思いますよ。
どうしても、3の方法でやる場合でしたらキーはPrimaryKeyだけでなくそれぞれインデックスをつけて、
Do Until TRN.EOF
Set MST=CurrentDB().OpenRecordset("抽出するSQL文",dbOpenDynaset)
If MST.EOF=True Then
MST.AddNew
Else
MST.Edit
End If
・
・
・
MST.Update
MST.Close
TRN.MoveNext
Loop
TRN.Close
っていう感じでやります。
上で書いたようにキーの2つのフィールドにインデックスが設定されている場合、1が一番速いように思います。
回答ありがとうございます。
3の方法ですが、
findもseekも使わず、1件1件上から調べて行く方法を考えてました。
findやseekの場合、トランザクションファイルの件数分だけ行わないといけないですが、1件1件マッチングさせていくと2万件を1回見てやるだけで済むと思ったんです。(説明が分かりづらくてすみません。)
凄い省略して書くと
MST = OpenRecordset(マスタ)
TRN = OpenRecordset(トランザクション)
Do Until TRN.EOF
If MST.[キー] = TRN.[キー] then
マスタ修正
MST.MoveNext
TRN.MoveNext
ElseIf MST.[キー] > TRN.[キー] then
マスタ新規追加
TRN.MoveNext
Else
MST.MoveNext
End If
Loop
MST.Close
TRN.Close
(キーを昇順とした場合です。)
(マスタが先にEOFになった場合の処理とかは省略しています。)
合ってるかどうかよく分からないですが、非常に簡単に書くと3はこんな感じのつもりでした。
まず、一番最初の方に答えて頂いたクエリーの方法で試してみます。
ただ条件によってマスタの変更するフィールドが変ってくるので(10箇所位)クエリが30個位になるので条件によってSQLを切り替えるようにしていきたいと思います。
似たようなクエリーが増えるのって嫌じゃないですか?
みなさんどうなされているのでしょうか。
どうもありがとうございました。
またよろしくお願いします。
No.3
- 回答日時:
アクセスのコーディングそのものになっていませんのでお気に
召さないかもしれませんが、寝る時間になったので・・・。
レコード数が多いマスターに対し、数が少ないトランザクションのマスター更新では、色々の処理ロジック考えられる(注)が、一般には
(1)マスターレコードをキー項目でソート(2)トランザクションレコードを同じキー項目でソート(3)(情報処理試験の解説書に良く出てくる)マッチングのロジックで更新するのが一番早いと思います。
マッチングの処理はご存知でしょうが、
p4:マスターを1レコード読む(キーをK1とする)
もしEOFならk1にハイバリューをセット(ハイバリュー例16進F FFF... )
第1レコード以外はp6へ
p5:トランザクションを1レコード読む(キーをK2とする)
もしEOFならk2にハイバリューをセット(ハイバリュー例16進F FFF... )
p6:if k1=k2 then goto p1
if k1>k2 then goto p2
if k1<k2 then goto p3
p1: k1がハイバリュ―なら終わり(p7へ)
でなければトランザクションでマスターを更新
p2: トランザクションでマスターを作る。
次ぎのトランザクションレコードを読みにいく(p5へ)
p3: 次ぎのマスターレコードを読みにいく(p4へ)
p7:ファイルをクローズ
end
昔大型コンピュターのオフラインバッチ処理のマスター更新の定番
でした。メモリーが少ないコンピュター時代でそれなりの採用理由があったと思います。ソートプログラム(のロジックがメーカー製で優秀で)早かった事も寄与したでしょう。
(注)1例としてマスターを1レコード読むごとに、全トランザクションを舐めて等しいキーのものが見つかると更新するとか。トランザクションが同一キーが2以上あるかでロジックが変わる。ないと仮定して良いなら見つかって後は打ち切って、次ぎのマスターレコードへ行ける。
回答ありがとうございます。
おっしゃらる通りです。
私が3番目に考えていた方法がそんな感じです。
省略したコーディングを2番目に回答して頂いた方のお礼に書いています。
こんな感じでしょうか?
こういったやり方とクエリーを複数回実行するのとではどちらが負荷を掛けずに処理が行えるのか、またどちらが一般的なのかが分かりませんでした。
ご丁寧な回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Visual Basic(VBA) エクセルのマクロについて教えてください 物件ごとのフォルダを作成してます そのフォルダ内にサブフォル 2 2023/07/02 17:58
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Excel(エクセル) Excelの関数についての質問です。(vlookup関数) A列 B列. C 1 大阪 50. 検索 6 2023/08/11 13:35
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- Excel(エクセル) セルの値をグーグルで検索するエクセルVBAについて! 2 2022/08/01 21:41
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessdでの「トランザクション...
-
INSERT分の処理速度がトランザ...
-
postgresql についてです
-
【DB】同じトランザクション内...
-
SQL Server 2005トランザクショ...
-
警察はスマホに保存した動画や...
-
accessの処理が遅い
-
PCが悪くなって新しいPCにSSMS...
-
DATファイルをEXCELで開きたい
-
復旧中のデータベースについて
-
業務用のデータベースサーバー...
-
DAOファイルのSQLクエリの部分...
-
ファイルメーカーで画像を参照...
-
accessの上限容量2Gでは容量が...
-
SQL*Loaderのコミットポイント...
-
Sqliteで使えない文字。
-
SQL Server Management Studio ...
-
oracleデータベースの更新履歴
-
SQLデータベースを削除する方法
-
パラメーターエラーで復元でき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【DB】同じトランザクション内...
-
postgresql についてです
-
TPSとは・・・
-
Accessdでの「トランザクション...
-
一つのトランザクションでSELEC...
-
ADO Connection を再利用する方法
-
dbFailOnError とは?
-
SAPのSPROって何の略ですか?
-
OracleのROWIDについて…
-
SQL Server 2005トランザクショ...
-
汎用系システムのDBについて
-
INSERT分の処理速度がトランザ...
-
accessVBAでのワークスペース
-
jmeterについて、教えてください。
-
ロールフォワードとロールバッ...
-
ロールバックとロールフォワー...
-
DBサーバー妥当性
-
DBMSのロールフォワードについて
-
オラクルのロールバックセグメ...
-
MySQLとPostgleSQL、ど...
おすすめ情報