• ベストアンサー

access2003で軽快な検索クエリを作るには?

access2003で検索フォームを作成しています。 リレーションの結ばれた複数のテーブルを対象に、検索語句による検索をしようとクエリを作っています。 基本となるテーブルには数値(ID)が中心となっており、それらの実際の値をDlookUpで参照して結果を作っています。 この際に、DlookUpで指定した参照元について抽出条件を設定すると異様に時間が掛かり、実用的ではなくなってしまいました。 テーブルの構成上、DlookUpを使わざるを得ないので、その参照元も含めて検索語句で抽出できるようにしたいのですが、 どのようにすればレスポンスの良い検索クエリができますでしょうか。

  • Gntym
  • お礼率58% (39/67)

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

  • ベストアンサー
noname#60992
noname#60992
回答No.4

ついでに、 http://www.accessclub.jp/ado/refresh.html http://www.amy.hi-ho.ne.jp/banchan/sw/vba/v1.html ADOにてSQLとは、こんな感じです。 クエリーが作れれば、それをSQLビューにすると(カッコだらけですが)SQL文を見ることができます。 (コピーしてVBAに貼り付けるだけでよいわけです。) コネクションを変えるとサーバに直接問い合わせることができます。 (dbによりSQL文が多少異なるものもありますので調整が必要になる場合もあります。)

Gntym
質問者

お礼

ご丁寧に有難うございます。 現在、複数のクエリと複数のワークテーブルを組み合わせて、 とりあえず思うような結果が出力できるものを製作中です。 完成したら、ADOでのデータアクセスに挑戦してみます。 どの程度負荷が軽減され、動作が軽快になるのか楽しみもありますね。 リンクはScrapBookに保存しておきます。 改めて、ADOに躓いたら質問させて頂きます。 ご回答頂きました皆様、有難うございました。

その他の回答 (3)

noname#60992
noname#60992
回答No.3

No2ですが、 リンクテーブルなら、インデックスは設定できません。 MDB内で完結させようとすると、クエリの作成方法に全てがかかってくることになります。 >ワークテーブルを用意し検索の度に削除クエリと追加クエリを実行し最新の状態にし、そのワークテーブルを一つのクエリで抽出するようなイメージのものです。 リンクテーブルであれば、このようなやり方をすることになります。 順番によって速度が変わることがありますのでいろいろやってみるのが良いと思います。 どちらかといえば、ADOでSQLを使う方法をとられたほうが、将来的にデータが増えた際の対応としては楽になると思います。(直にサーバにSQL文で問い合わせをするよう変更するだけですから。) そんなに難かしいことではありませんので、取り組んでみたらいかがでしょうか?

noname#60992
noname#60992
回答No.2

実際に実験してみないと効果があるかどうかはわかりませんが、 1.インデックスを指定する。 検索されるフィールドにインデックスを振っておくことにより検索が早くなることがあります。 2.パラメータクエリ(選択)を使用した場合とDLookupを使った場合で時間を比べてみる。 >テーブルの構成上、DlookUpを使わざるを得ないので 私は、そんな場合に直面したことはありません。 ほかのやり方が必ずあると思います。 3.ADOのSEEKメソッドを使った際の時間と比べてみる。 4.ADOで直接SQLを使ってレコードセットを作ってみる。 経験上(大したものではありませんが)では結局のところ(2)普通の選択クエリを使うのが一番早いことが多いです。 複数のテーブルがリンクされていて、それぞれに抽出条件がある際は、数が限定されるクエリを先に行い仮テーブルに書き出しておくことにより、レスポンスが良くなることがあります。 データベース構造とは関係ありませんが、Accessをインストールしているドライブと、MDBがおいてあるドライブを物理的に分けると多少早くなるという話があります。(比較したことはありません。)

Gntym
質問者

補足

ご回答有難うございます。 ADO,SQLのについてまだ理解していないので、1,2項の部分について取組んでみたいと思います。 その場合、、、 1.については、検索対象はLAN内のSQLサーバーのテーブルにリンクさせています。 この場合、現在のmdbのリンクテーブルにインデックスの設定をしても構わないものなのでしょうか? また、それでインデックスの効果が出るのでしょうか? 2.については、DlookUpを使わないで選択クエリを用いるということは、クエリを階層化するという事でしょうか。 過去に経験があるのは、ワークテーブルを用意し検索の度に削除クエリと追加クエリを実行し最新の状態にし、 そのワークテーブルを一つのクエリで抽出するようなイメージのものです。 この考え方でよいのでしょうか? フォーム上からの検索契機に対して、2重(3重?)のクエリを実行させる事になりますので、荒業的なのかなとも心配です。 お手数お掛けいたしますが、アドバイス頂けたら幸いです。 3.4についてはスキルアップに伴って検証してみます。

  • fly_moon
  • ベストアンサー率20% (213/1046)
回答No.1

DlookUpで指定した参照元のデータ件数が異常に多い?そうでもなければ、参照元が複雑なクエリになっているとか。又は、外部のDBを参照してると遅いですけど、そんなことではないですよね? 情報が少ないので、何が原因かはよく解らないですね。思い当たりそうな物を書いてみました。

Gntym
質問者

補足

早速のご回答有難うございます。 漠然としていて申し訳ありません。 どの程度まで表現するとうまく伝わるか、考えてはいるのですが、まだまだ未熟もので。 ちなみにテーブルは全てリンクテーブルで、社内のSQLサーバーにリンクしています。 このテーブルから現場に合わせた情報を検索したいと思っています。 また、件数は15,000レコードを越えているところで、今後も5,000件/年程度増えていくと思われます。 この辺がボトルネックだとすると、構成を考え直さなければいけないなと。 なお、DlookUpの指定によっては条件が複雑すぎるというエラーが出ます。 リレーションのつなぎ方などを再考してみます。

関連するQ&A

  • Access、検索用フォームでのあいまいな検索

    現在、Accessでデータベース作成をしています。 テーブル:  ・テーブルA          ・テーブルB          (A・B間にリレーションシップ設定) クエリ    ・検索クエリ(テーブルA・テーブルBを元に作成) フォーム   ・検索用フォーム(デザインビューでフォーム作成より)          ・検索結果フォーム(検索クエリを元に作成) また、以下のような設定を入力しました。 「検索クエリ」の抽出欄  Like "*" & [Forms]![検索用フォーム]![検索したい名前] & "*"・・(1)  ※検索したい項目、すべての抽出欄に設定済 「検索用フォーム」  検索実行ボタンを作成し、マクロを設定  ・フォームを開く→「検索結果フォーム」  ・フィルタ→「検索クエリ」 上記の設定により、検索用フォームに検索文字を入力することで、その結果を「検索結果フォーム」に反映することができました。 ただ、テーブルAが元になっている項目の抽出欄のみに(1)を入力すると、うまくいくのですが、テーブルBが元になっている項目欄にも (1)を入力しようとすると、検索用フォームからうまく検索することができなくなります。 2つのテーブルを元にしたクエリからは、検索用フォームをつかった複数のOR検索はできないのでしょうか?? ご存知の方、ぜひ教えてください。 よろしくお願いいたします。

  • アクセス2000でクエリを組んだのですが。。。

    こんにちわ。アクセス初心者です。まず順に追って説明します。 (1)15000件ある顧客名簿と1500件ある担当会社のテーブルをリレーションで結び、クエリを組みました。「Q_顧客名簿」と名づけました。その時点で15000件データが存在します。 (2)フォーム「Q_顧客名簿」を元にフォームを作成しました。そして氏名の曖昧検索をしたいのでまずフォームのテキストボックスに「氏名検索」と名づけて、クエリの画面に戻り「Q_顧客名簿」を元に新たなクエリを組み、「氏名」のフィールドの抽出方法に以下のような文を入れました。 『Like "*" & [forms]![集合フォーム_1]![氏名検索] & "*"』 このクエリを「Q_氏名検索」と名づけました。 (3)フォームの左端をに「Q_氏名検索」が生きるよう設定をし、「氏名検索」のテキストボックスに「再クエリ」を組んだのですが、顧客データ数が15000あるはずなのが11000まで減ってしまいました。 おそらく検索式に何かが足りないのだと思うのですが、SQLやVBAがわからないのでどうすればいいかわかりません。 アクセスの詳しい方、教えていただけませんでしょうか?よろしくお願いいたします。

  • アクセス 数値型にするとフォームの入力ができない

    お世話になります。色々調べたり、実験してみたのですが、分からない点があります。 簡単でいいので、可能性のある原因を教えてください。 アクセス2003です。 ■パターン1  フォームC の入力ができる テーブルA(主キーがオートナンバー型)、その他4つのテーブル(これら5つのテーブルは、参照整合性リレーションで結ぶ) →それらを元にクエリBを作る→クエリBを元にフォームC を作る ■パターン2  フォームC の入力ができない テーブルA(主キーが数値型)、その他4つのテーブル(これら5つのテーブルは、参照整合性リレーションで結ぶ) →それらを元にクエリBを作る→クエリBを元にフォームC を作る 簡単にいうと、テーブルのデータ型によって、入力可否が変わるのです。 なぜ、パターン2は、入力できないのか分かりません。 よろしくお願いします。

  • Accessのパラメータクエリについて

    Accessのパラメータクエリがうまく動かなくて困ってます。 実はODBC経由でリンクテーブルを作っておりまして、そこからパラメータクエリで抽出を試みたのですが、パラメータは聞いてきますが抽出できません。 選択クエリ状態で直接抽出条件を入れてやれば何の問題もなく通常のテーブルと同様に抽出できるのですが、パラメータクエリにする、または同じ事ですが他のフォームのコントロールを参照させる状態ですと、エラーも出ずにノンデータとなります。 これって何故なんでしょうか?対処方法はありますか? ちなみにリンク元のテーブルはオラクルですがデータ型とかが関係あるのでしょうか?

  • ACCESSのクエリでDlookup関数・戻り値の属性は

    ACCESSのクエリの中で、抽出したい項目を式で定義しているのですが、Dlookup関数を使っています。 そのとき、数値項目だと思っていたのですが、文字として値が返ってきているようです。(数字が左詰めになっているので) Dlookup関数の戻り値は、このような使い方をした場合、文字として返ってくるのでしょうか。 (Nullというのが返ってきている場合もありました) クエリ上で使っている式は、このようなものです。 前月戸建契約数: DLookUp("契約数","テーブル名", "担当者名='" & [担当者名] & "' And 月次='" & [前月] & "'") [担当者名]は元になるテーブルにあり、[前月]はクエリ上で、(テーブル上の)[月次]-1で式として定義しています。 よろしくお願いします。

  • アクセス2000でクエリーで更新できない

    アクセス2000で簡単なプログラムを作成中なのですが、2つのテーブルをリレーションで繋いでそれぞれ必要項目を抽出するクエリーを作成しました。 このクエリーをフォームに使って空欄のエリアにデータを 入力しようとしたら次のメッセージとなりました。 「このレコードセットは更新できません。」となってしまいます。根本的なミスのような気がしますが、気が焦っていて思いつきません。どこの設定を見れば良いか、どなたかご教示ください。 よろしくお願いします。

  • Access2007 クエリが読み取り専用になってしまう

    Access初心者です。 3つのテーブルのデータ(全て)をクエリに抽出して、そのクエリからフォームを作成し、フォーム上からデータ入力をしていきたいと考えております。 しかし、上記方法で作成したフォームは入力ができなく、ヘルプで調べたらフォームが読み取り専用になっているようでした。 いろいろ検索したのですが、どうやら更新可能なクエリにする必要があるみたいなのですが、その方法が分かりません。 宜しくお願いします。

  • Access2003 検索用フォームでの検索がうまくいかない

    Access2003 検索用フォームでの検索がうまくいかない とある、テーブルを参照するフォームを作成。 そしてテキストbokを設けて、各項目毎にキーワードを指定してデータを抽出できるようにしたいのですが、 どうもうまくいきません。 検索は出来ているのですが、全部ひっかからないのです。 例えば ID という項目を検索するbox に"1"を入力して ID=1の全データを抽出しようとすると、一部検索にかかってこないものがある という具合です。 テーブルに入力されている数字や文字が本当に一致しているかどうかも調べましたが確かに一致しています。 実際、テーブルを開いて ctr+f で検索すると全てひっかかります。 何が原因なのでしょうか??? 私の作った手順は以下のとおりです。 テーブル作成(エクセルからインポート) ※空白の欄もあります フォーム新規作成でフォーム作成 フォーム上にテキストbox作成 クエリ作成 (Like "*" & [Forms]![フォーム名]![テキストbox名] & "*" ) マクロ作成⇒フィルタ実行/上の手順で作ったクエリを登録 マクロをフォーム上へドロップ およそこのような手順です。

  • ACCESS2000 クエリーを開いてテーブルのデータを更新したい

    ウィンドウズ98,ACCESS2000です。 二つのテーブルがあって、リレーションがあります。 これを元にクエリーを作成して、クエリーを表示させたフォームでデータの更新や削除を行いたいと思っております。 が、実際やろうとするとこのレコードセットは更新できませんとでます。 何か考えられる理由はありますか? よろしくお願いします。

  • Access不一致クエリについて

    不一致クエリを使用して二つのテーブルにある両方のテーブルに存在しないレコードを抽出しようとしています。 各テーブルに数値が入っていてその数値に違いがある分に関しては不一致クエリによって表示されるのですが、一つのテーブルのレコードは”0”でもう一つのテーブルには ”10”と入っているレコードの抽出ができません。 初歩的な事で申し訳ないのですが、お知恵をかしてください。

専門家に質問してみよう