#659 複数値フィールドの中の値を条件に抽出するには? クエリ

テーブルのデザインにおいて、フィールドに対して下記のようなプロパティ設定を行うと、ひとつのフィールドに複数の値を保存することができます。
  1. [ルックアップ]タブにおいて「表示コントロール」を”コンボボックス”にする

  2. それに準じて値集合ソースや列数などコンボボックスの各プロパティを設定する

  3. 同じく「複数の値の許可」プロパティを”はい”にする


その結果、データシートビューでは次のような表示、項目の選択が可能となります。





このとき、ある1レコード・1フィールドの値と、その中にある複数の値とは、1対多の関係を持った2つのテーブルのように考えることができます。

まず一般的な1対多の2つのテーブルを見てみます。
  1. クエリにおいて「得意先」テーブルのフィールドを配置します。



    このとき、当然のことながら「得意先」テーブルに保存されているのと同じレコード数が表示されます。

  2. 次に、「得意先」を1側とした場合、多側となる、つまり同じ得意先IDが複数レコードに存在しているテーブル「受注」を結合してみます。



    このとき、ある得意先IDが「受注」テーブル側に2レコードあれば、クエリの出力結果は2レコードに展開されます。また5レコードあれば出力結果は5レコードです。つまりクエリで結合したとき、1側にはそれぞれ1件しかないデータでも、多側テーブルに複数あればそのレコード数だけ出力されることになります。

今後は、同様にして、複数値のフィールドを持ったテーブルについて上記と同じようなクエリ操作をしてみます。
  1. クエリにおいて「mtbl商品マスタ」テーブルのフィールドを配置します。このとき、複数値を持つフィールドとして「仕入先」をグリッドに配置します。



    「mtbl商品マスタ」テーブルに保存されているのと同じレコード数がそのまま表示されます。また、テーブルのデータシートを開いたときと同様に、「仕入先」フィールドにはカンマで区切られて複数の値が表示されていることが分かります。

  2. 次に、テーブルのフィールドリストから「仕入先.Value」をグリッドに追加配置します。



    前述の1対多のテーブル結合と同様に、同じ「商品コード」「商品名」「仕入先」のレコードが複数レコードに渡って表示されていることが確認できます。これらのフィールドは言わば1側のテーブルのレコードのような扱いになっています。
    そして、多側の扱いと同様に「仕入先.Value」の値はそれぞれ1レコードずつに展開されていることが分かります。

以上のことから、複数値を持つフィールドを「●●」としたとき、「●●.Value」というフィールドをグリッドに配置することで、複数値の中の1つ1つの値を条件としてレコードを並べ替えたり抽出したりすることができることになります。

たとえば、上記クエリにおいて「仕入先」に「2」を含むレコードを抽出したいのであれば、下記のような選択クエリを作ればよいことになります。




また、「仕入先」に「2」または「15」を含むレコードを抽出し、かつ仕入先順に並べ替えたい場合は、下記のようなクエリとなります。




さらに、「仕入先」の複数値の値集合ソースとなっているのは「仕入先」テーブルですので、そのテーブルを結合することで仕入先名なども出力させることができます。そのときの結合フィールドは「仕入先.Value」と「仕入先ID」です。




以上のように、『●●.Valueというフィールドを使えばよい』ということを覚えておけば、あとはふつうのクエリと同様に、さまざまな抽出・並べ替え・結合、あるいはアクションクエリなどへの応用も可能です。当然のことながらSQL文をVBAのプログラムで組み立てて実行する際も同様です。
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved