ACCESS SQLビューで条件分岐の処理速度

このQ&Aのポイント
  • ACCESS操作、ACCESS VBAどちらも超初心者の方へ。テーブルAとテーブルBの伝票NOが一部一致した場合に、テーブルBの伝票名を表示するクエリを作成しましたが、処理速度が遅くなっています。メインフォームにテキストボックスを作り、検索結果を別の表示フォームで表示する方法です。初心者にもわかりやすく処理速度を上げる方法を教えてください。
  • ACCESS SQLビューを使って、テーブルAとテーブルBの伝票NOを一部一致させ、テーブルBの伝票名を表示するクエリを作成しました。しかし、処理速度が非常に遅いです。メインフォームにテキストボックスを作り、検索結果を別の表示フォームで表示する方法です。初心者向けに処理速度を上げる方法を教えてください。
  • ACCESS操作やACCESS VBAについて超初心者の方です。テーブルAとテーブルBの伝票NOを一部一致させ、テーブルBの伝票名を表示するクエリを作成しましたが、処理が遅いです。メインフォームにテキストボックスを作り、検索結果を別の表示フォームで表示する方法です。誰でも理解できるような処理速度の改善方法を教えてください。
回答を見る
  • ベストアンサー

ACCESS SQLビューで条件分岐の処理速度

いつもお世話になっております。 ACCESS 操作、ACCESS VBAどちらも超初心者です。 テーブルAの伝票NOとテーブルBの伝票NOが 一部一致(伝票NOが10ケタならば左5ケタ、伝票NOが8ケタならば左4ケタが一致)したら、テーブルBの伝票NOに該当する伝票名を表示させるクエリを作成しました。 2つの伝票NOが完全一致していないので、リレーションシップが使えないと思い、 SQLビューでIIFとLEN,LEFTを使っているのですが、 かなり表示させるスピードが遅くなってしまいました。 表示はメインフォームにテキストボックスをつくり、そこに検索するテキストを入力→上記のクエリから検索した結果を別の表示フォームで表示させる…としているのですが、 処理速度を上げる方法はないでしょうか? 初心者にもわかりやすく教えていただけたらと思います。

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

  • ベストアンサー
回答No.2

SQLの ON句を下記のように書き換えて、テーブルB.CSNo にインデックスが設定してなければ設定してください。 ON テーブルB.CSNo=IIf(LEN(テーブルA.伝票NO)=10,LEFT(テーブルA.伝票NO,5),LEFT(テーブルA.伝票NO,4)) 現状だとテーブルB.CSNoが関数の引数になっているのでインデックスが利用できませんが、上記なら有効になります。 これで改善できないようなら、『伝票NOを5ケタ、4ケタに加工した列を追加する』という方法になるでしょう。 その場合は、追加したフィールドにもインデックスを設定します。

okwv-first
質問者

お礼

教えていただいたSQLにしたところ、劇的に改善されました!(*^^)v 驚きました!  ありがとうございます!  またよろしくお願いします!

その他の回答 (1)

回答No.1

適切な回答をするには情報が不足してますね。下記の情報を補足してください。 現状のテーブルのレコード件数は何件か。 > 表示はメインフォームにテキストボックスをつくり、そこに検索するテキストを入力→上記のクエリから検索した結果を別の表示フォームで表示させる… 現状のクエリの概要(できればSQLを提示すると分かりやすい) 具体的にどのように抽出しているのか。(パラメータクエリまたはフィルター・・・?) 現状のテーブルの設計変更は可能か。 もし可能なら高速化できる可能性は高いです。 現状の設計のままだと大きな改善は期待できません。

okwv-first
質問者

補足

早速の回答、ありがとうございます。 現在のところ、テーブルAは7500件(10000件予定)、テーブルBは90件(150件予定)です。 クエリをつくり、SQLビューに下記を記入しています。 SELECT [テーブルA].ID, [テーブルA].日付, [テーブルA].伝票NO, テーブルB.伝票名称, [テーブルA].製番, [テーブルA].受領欄, [テーブルA].PDF FROM テーブルB RIGHT JOIN テーブルA ON IIf(LEN(テーブルA.伝票NO)=10,テーブルB.CSNo=LEFT(テーブルA.伝票NO,5),テーブルB.CSNo=LEFT(テーブルA.伝票NO,4)); テーブルAは毎日データが追加されていく予定なので、現在のところ変更はしたくないのですが、あまりに処理が遅いので伝票NOを5ケタ、4ケタに加工した列を追加することも考えています。 (もしくは、テーブルAのコピーを作り伝票NOを直接5ケタ、4ケタに加工、リレーションシップを作る) それではよろしくお願いいたします。

関連するQ&A

  • アクセス2003で、分岐処理ができないのですが…

    (マイクロソフト ACCESS2003) アクセス初心者です。 テーブルAから新しいテーブルXを作成します。 このとき、テーブルAの会員NOで、テーブルBの会員NOを参照して テーブルBの会員NOのニックネームを設定しますが、 テーブルBに会員NOがないときは、「ゲスト」と設定します。 上記の処理が、うまくできません。 VBAの知識がないとできないのでしょうか? どなたか、教えていただけませんか?

  • Access2000 フォームビューの表示関連

    どなたか、ホントにお助け下さい。 A、B、Cテーブルのデータを1つのフォームで表示入力できるよう、A、B、Cを繋げたクエリ作成し、 A対B、A対Cの一対多リレーションシップ設定したんですが、フォームビューで確認すると背景だけで表示されません。 ・コントロールのプロパティの「可視」の状態は「はい」  コントロールのはフォーム上の配置位置が「ページヘッ ダー/フッター」は「詳細」となっております。 切り分け内容 ・フォーム-対象フォルダ選択-開く-背景表示無し -プロパティ-レコードソース-クエリー-レコードソースを外すと”入力フォーム自体”は表示されるようになりますが、各々#Name?となってしまいます。 お助け下さい。

  • ACCESS 2003の条件分岐について教えて頂けないでしょうか?

    access2003を勉強中です。 先週1週間かけても解決できないことがありまして、どなたか教えて頂けないでしょうか。 内容は 会社で使用する勤務表に関してです。 ユーザー名(コンボボックス)、日付(カレンダーコントロール)、 出社時間(テキストボックス)、退社時間(テキストボックス 、作業内容(テキストボックス)をユーザーが入力し「登録」 コマンドボタンのイベントで入力した内容を、勤務表テーブルに 反映させたいのです。 その時に同じユーザーの同じ日付を2件入力させないようにしたいので フォームに入力された内容からユーザー名と日付によって、 同じ内容が勤務表テーブルに無ければinsert、有ればupdateと 条件分岐をしたいのです。 しかし、 Public Sub kinmu() Dim mmrs As ADODB.Recordset Dim mmcn As ADODB.Connection Set mmrs = New ADODB.Recordset Set mmcn = Application.CurrentProject.Connection mmrs.Open "勤務表", mmcn, adOpenKeyset, adLockOptimistic mmrs.MoveFirst If DCount("[ユーザー名] & [日]", "[勤務表]", "[ユーザー名]=[Forms]![フォーム1]![コンボ56]" & _ "and[日]=[Forms]![フォーム1]![テキスト88]") = 0 Then mmcn.Execute "INSERT INTO 勤務表 ([ユーザー名],[日],[出社],[退社],[作業内容]) VALUES ([Forms]![フォーム1]![コンボ56],[Forms]![フォーム1]![テキスト88],[Forms]![フォーム1]![テキスト8],[Forms]![フォーム1]![テキスト17],[Forms]![フォーム1]![テキスト28]);" Else mmcn.Execute "UPDATE 勤務表 SET (ユーザー名=[Forms]![フォーム1]![コンボ56],日=[Forms]![フォーム1]![テキスト88],出社=[Forms]![フォーム1]![テキスト8],退社=[Forms]![フォーム1]![テキスト17],作業内容=[Forms]![フォーム1]![テキスト28] where [ユーザー名]=[Forms]![フォーム1]![コンボ56] and [日]=[Forms]![フォーム1]![テキスト88]);" End If として、「登録」コマンドボタンのイベントとしてCallキーワードによって呼び出そうとしているのですが、うまくいきません。 最初はDCount関数で件数を求め、それを変数に入れる。 IIF関数による分岐。などいろいろ試してはいたのですが、、、。 どなたか教えて下さい。よろしくお願いします。

  • Access2002 フォーム間のデータ受け渡し条件による動作分岐

    いつもお世話になっております。 未だ初心者のものです。 表題ではわかりにくいと思いますが、ああしか書けなかったのでお許し下さい。 本題ですが、人員の情報フォーム(フォームA)に、コマンドボタンを設け、他のフォーム(フォームB)を開く作りにしています。 コマンドボタンを作成するときに自動起動されるウィザードにしたがって、人員のIDとマッチするデータを表示するよう、コマンドボタンは設定されています。 フォームBの元になっているテーブルに、その人員のIDと付帯情報が入っていればフォームBはうまく表示されるのですが、まだ付帯情報が入っていない場合、当たり前ですが空白のフォームが現れます。 そこでご相談なのですが、フォームBの元テーブル(あるいはクエリ)にデータがない場合はフォームB用のデータ入力をさせるフォーム(フォームC)を表示させる様にはできませんでしょうか? これだけの情報ではイメージできないかも知れませんので、追加情報が必要であれば、逆質問をお願いします。 よろしくご回答のほど、お願いします。

  • AccessのIIFの引数の条件について教えてください。

    こんにちは。 初心者すぎて申し訳ございませんが、ご教授お願いいたします。 クエリを作成し、そこにiifで条件を入れたいと思います。 そのフィールドには、”承認済”・”未承認”・”申請前”と、3種類があります。 また、フォームのオプションボタンは”1”・”2”があります。 (1)オプションボタンが”1”ならば”承認済” (2)でなければ、”未承認”と”申請前”となっている結果を表示させたく思います。 クエリの抽出条件に以下の条件を書いてみたところ、 「式が正しく入力されていないか、複雑すぎるために評価できませんでした。~」 となってしまいます。 IIf([Forms]![フォーム1]![フレーム8]=1,"承認済","未承認" Or "申請前") 条件を1つ削り以下の式は、正しく表示されるのですが・・・。 IIf([Forms]![フォーム1]![フレーム8]=1,"承認済","未承認") いろいろやってみたのですがわかりませんでした。 お手数ですが、以上よろしくお願いいたします。

  • ACCESSでのクエリ抽出条件について

    ACCESS超初心者です。 自分なりに調べたのですが、知識不足によりお手上げ状態です。 クエリの抽出条件について、どなたかご教授いただけますでしょうか? OS:XP ACCESS:2000 ・フォーム上に自由に入力できるテキストを3つ用意します。 ・入力された3つのテキストが1つのフィールドに含まれるものをクエリで抽出したい。 ・3つのテキストが空欄の場合は全てのデータを抽出したい。 ■フォーム上のテキスト  テキスト1:テキスト10  テキスト2:テスト11  テキスト3:テスト12 ■テーブル  フィールド1:問合せ内容(1) ■クエリ内の抽出条件 Like "*" & [Forms]![F_検索テスト]![テキスト10] & "*" And Like "*" & [Forms]![F_検索テスト]![テスト11] & "*" And Like "*" & [Forms]![F_検索テスト]![テスト12] & "*" テキスト名がおかしいのですが、ご了承下さい。

  • ACCESS クエリの抽出条件

    毎度お世話になります。 クエリをレコードソースとするフォームから、コマンドボタンでアクションクエリを実行するときの抽出条件の書き方を教えて頂けないでしょうか? 二つのテーブル(別のACCESSファイルからリンク)を基にパラメータクエリを作っています。 そのクエリを基にフォームを作っています。 さらに、そのフォームに追加クエリを実行するボタンを置いています。 フォームに表示してあるレコードだけ(パラメータで抽出されたレコードだけ)、他のテーブルに追加しようと思っているのですが、実行ボタンを押すともう一度パラメータが出てきてしまいます。 多分テキストボックスの値を読み取る際にレコードソースがテーブルでないのが問題じゃないかと思うのですが。。。 テーブル:Container / Items クエリ:From_Con(パラメータは[Container]フィールド) フォーム:From_Con(テキストボックス名は[txtContainer]) 追加クエリ:From_Con_App(抽出条件は[Forms]![From_Con]![txtContainer]としてみたがうまく動きません。) デザインビューの抽出条件を使う方法? SQLを使う方法? QueryDefを使う方法? いろいろありそうですが、ネットで検索してもヒットしません。 分かりにくい説明で申し訳ありませんがご教授願います。

  • AccessのSQLビューで書式を設定したい

    いつもお世話になっております。 AccessのSQLビューでユニオンクエリを作成しています。 このとき数字の書式を数値型から標準型に変更したい(3桁ごとに区切り点を表示させたくない)のですが、どのようにしたらよいのでしょうか? ちなみに元のテーブルは区切り点のない書式ですが、ユニオンクエリを作成して表示すると区切り点が入ってしまいします。 よろしくお願いします。

  • ACCESSで複数条件でデータ抽出するフォームの作成

    ACCESS2000で複数の条件を入力し、該当するデータを抽出するフォームを作成しています。どんな方法がありますか?簡単に出来る方法をお教えください。 具体的には、売上明細データを検索します。あらかじめ テーブル:売上明細データ をいろいろなマスタを参照している クエリ:売上明細クエリ を元に抽出します 条件は売上日付の日付1と日付2の項目と、伝票区分の項目です。 フォームの頭にテキストボックスを3つ作成し、日付1~日付2までの売上日付で 入力された伝票区分のもののみを表示させたいのです。 検索というコンボボタンを配置し、クリック時にその下にクエリからの必要な表示項目を売上明細クエリから配置しています。 抽出する方法(条件の与え方)を教えてください。よろしくお願いいたします。

  • access 条件文についての質問

    accessのフォームの表設定で質問です。 テーブルAがあります。 カラムは下記です。 TYPE ,NO ,初診日 ,次診断日 あるフォームに、テーブルAの全テーブルを表示したいです。 内容は、TYPE, NO , 最新診断日。 最新診断日には、次診断日か、空であれば、初診日の日付をいれたいです。 コントロールソースには、既に TYPE, NOは入ってます。 最新診断日のコントロールソースを、どのように設定すればよいでしょうか。 =IIf(A.次診断日 Is Null,A.初診日,A.次診断日)で試してもダメで、 クエリ作成し、上記のようにしても、データが全件表示されません(半数ぐらい)。 上記で、全件でる方法か、コントロールソースの設定方法はわかりますでしょうか? (条件文違いでしょうか)

専門家に質問してみよう