Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


88 / 2272 ツリー ←次へ | 前へ→

【13055】SQLを使って、Dlookupを代用するやり方 morimu 16/7/25(月) 13:53 質問[未読]
【13056】Re:SQLを使って、Dlookupを代用するやり方 亀マスター 16/7/27(水) 18:56 回答[未読]

【13055】SQLを使って、Dlookupを代用するやり方
質問  morimu  - 16/7/25(月) 13:53 -

引用なし
パスワード
   テーブル A

A1 A2 A3 A4
X11 X11-1 X11-2 X11-3
X21 X21-1 X21-2 X21-3
X31 X31-1 X31-2 X31-3
X41 X41-1 X41-2 X41-3
X51 X51-1 X51-2 X51-3


テーブル B
B1 B2 
X11-1 1 
X21-1 2 
X21-2 3 
X31-1 4 
X31-2 10 
X31-3 11 
X41-2 12 
X41-3 13 
X51-1 14


テーブル A とテーブル B 2種類あります。
テーブル Aは4カラムですべて文字列
テーブル Bは2カラムですべて文字列


クエリCはこのような結果を得たいです。

クエリC
 
A1 A2 A3 A4                A5  A6  A7
X11 X11-1 X11-2 X11-3  1   0   0
X21 X21-1 X21-2 X21-3  2   3   0
X31 X31-1 X31-2 X31-3  4  10   11
X41 X41-1 X41-2 X41-3  0  12   13
X51 X51-1 X51-2 X51-3  14   0   0

1. クエリCとテーブルAのレコード件数は同じ
2. テーブルA の A2,A3,A4の値とテーブルBの B1とでVlookupして、B2の値をとります。ただし同じ行に値をとります。
  A2で取ったB2の値はA5、A3で取ったB2の値はA6、A4で取ったB2の値はA7のカラムにとります。

下のようにDlookupを使って実現できるのですが、テーブルAのレコード件数が多くて
実用的に遅くて使えないです。

フィールドに
A5:IIF(Dlookup("B2","B", "[B1] ='" &[A2]& "'")="",'0',Dlookup("B2","B", "[B1] ='" &[A2]& "'"))
A6:IIF(Dlookup("B2","B", "[B1] ='" &[A3]& "'")="",'0',Dlookup("B2","B", "[B1] ='" &[A2]& "'"))
A7:IIF(Dlookup("B2","B", "[B1] ='" &[A4]& "'")="",'0',Dlookup("B2","B", "[B1] ='" &[A2]& "'"))
と記載すれば、目的の値はとれることはわかる。

SQLを使って表現するには、どのようにすればよいかご教示いただけないでしょうか。
何卒よろしくお願い申し上げます。

【13056】Re:SQLを使って、Dlookupを代用するやり方
回答  亀マスター  - 16/7/27(水) 18:56 -

引用なし
パスワード
   ▼morimu さん:

>下のようにDlookupを使って実現できるのですが、テーブルAのレコード件数が多くて
>実用的に遅くて使えないです。

DLookupは基本的に遅い関数ですので、レコード1件ごとに3回も呼び出していれば遅くなるでしょう。また、IIfもレコード数が多いと速度低下につながります。

DLookupをSQLで同等のものを実現する方法ですが、以下のようにやります。

DLookup("フィールド名","テーブル名", "条件式")の代替として、
(SELECT フィールド名 FROM テーブル名 WHERE 条件式)

レコード数やその他条件にもよりますが、DLookupよりは速度的に改善されると思われます。

88 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078188
(SS)C-BOARD v3.8 is Free