アプリ版:「スタンプのみでお礼する」機能のリリースについて

AccessVBAで作業しています。
テーブル1の中に、A・B・C・D・E・Fという数値型のフィールドがあり、レコード数は6万件とします。
A=100 B=50 のA~Fのレコードをまず取り出し、
 レコード件数が1件ならF列の値を表示、
 レコード件数が複数ならC列の最大値を含むレコードを選択。
  それでレコード件数が1件ならF列の値を表示。
  それでもレコード件数が複数ならDの最大値を含むレコードを選択。
   それで件数が1件ならF列の値を・・・
   それでも複数件ならE列の最大値を・・・
と続きます。
そのたびに元のテーブル1から選択してくるのは効率が悪い気がします。
みなさんはどのように処理されるのでしょうか。
また、レコードセットを使用したSQLの書き方がわからず困っています。
どなたか教えていただけませんか? 何卒よろしくお願いいたします。

A 回答 (2件)

私的方法


1.AとBの条件でFとFのカウント値を取る
2.1の結果がFのカウント値が1ならFの値を取る
→ここで処理終了
3.AとBの条件でCとCのカウントとFの最大値を取ります。この時Cの降順にソートします。グループ化すると言うことですよ。
4.3の結果の1件目のCのカウント数が1ならFの最大値を取る
→ここで処理終了
5.以下Dに対して、Eに対して・・・同文

て方法が簡単ですね

通常ワークテーブルにCからFの値を入れてから上記の方法をすれば件数にもよりますが速い処理が可能となります。
SQL的には
INSERT INTO WKTBL (C,D,E,F)
SELECT C,D,E,F
FROM TRNTBL
WHERE A = 100 AND B = 50

その後はWKTBLにて処理をするこの時はA、Bの条件は不要。

レコードセットはpaz777さんので良いでしょう。
    • good
    • 0
この回答へのお礼

目が覚めた感じがします。私は随分難しいことを考えていたんですね。
「ソートをかけてグループ化」、思いつきもしませんでした。
良い方法を聞けて良かった。心から感謝します。
本当にありがとうございました。

お礼日時:2001/04/07 00:33

こんにちは。



少し質問があるのですが、
> レコード件数が複数ならC列の最大値を含むレコードを選択。
の時に「A=100 B=50」は抽出条件に入りますか?
もし入るのであれば、最初に「A=100 B=50」だけの条件で抽出したデータ
を別テーブル(例えばテーブル2)に格納したあとに別テーブルを元にし
て参照すれば、そんなには負荷はないように思うのですが・・・

Accessのバージョンが不明なのですが、2000か97でしたら以下に使用例を
明記します。これが正解って訳ではありません。他にも色々とやり方はあ
りますのでj279702さんもお勉強してみて下さい。

---------------------------------------------------------------------
'
Dim DBN As Database 'データベース定義
Dim SNAP As Recordset 'SnapShot用
Dim DYNA As Recordset 'Dynaset用
Dim SQLSTR As String 'SQL構文
'
'
' 検索SQL文を作成
SQLSTR = "" '↓ここにSQLを記入
SQLSTR = SQLSTR & "SELECT * FROM テーブル1"
SQLSTR = SQLSTR & " WHERE A = 100 AND B = 50"
'
' データベース接続
Set DBN = DBEngine.Workspaces(0).Databases(0)
Set SNAP = DBN.OpenRecordset(SQLSTR, DB_OPEN_SNAPSHOT)
Set DYNA = DBN.OpenRecordset("テーブル2",DB_OPEN_DYNASET)
'
' 検索結果
If SNAP.BOF = True Then
MsgBox "データはありませんでした。", 48, "検索結果"
SNAP.Close
DYNA.Close
Exit Function
Else
' データコピー
SNAP.MoveFirst
Do Until SNAP.EOF
DYNA.AddNew
DYNA("A") = SNAP("A")
DYNA("B") = SNAP("B")
DYNA("C") = SNAP("C")
DYNA("D") = SNAP("D")
DYNA("E") = SNAP("E")
DYNA("F") = SNAP("F")
DYNA.Update
SNAP.MoveNext
Loop
End If
SNAP.Close
DYNA.Close
---------------------------------------------------------------------
見当違いの回答でしたらごめんなさいです。
ではでは・・・
    • good
    • 0
この回答へのお礼

質問の仕方が悪くてすみませんでした。欲しかったお返事です。
今まで誰かに質問して、ここまで教えて頂いたことはありませんでした。
すごく感激しています。
レコードセットを保持するよりテーブルで作業すれば早い処理が出来るとは思っていませんでした。やはり勉強不足ですねぇ。これからも頑張ります。
本当にありがとうございました。

お礼日時:2001/04/07 00:39

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