- ベストアンサー
クエリで同一テーブルの複数回参照について
- 顧客情報の入ったテーブルにメイン担当者IDとサブ担当者IDがあり、別テーブルの社員情報から社員名などを引っ張ってくるクエリを組んでいます。
- 現在は、メイン担当者名とサブ担当者名を持ってくる為に社員情報を2回追加して、それぞれで両方にある担当者IDをキーにして結合させているのですが、テーブル1回の追加でメインとサブ両担当者の社員名を持ってくる方法はあるのでしょうか?
- まだ、ACCESSを勉強中のため色々と調べてみましたが知識不足のためか出来る出来ないの判断も出来ませんでした。出来ないなら諦めがつくのですが、もし1回の追加で済むならその方がシンプルで良いと思うのでもし方法があるようでしたら教えていただければと思います。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
【要旨】 『顧客情報』テーブルの『メイン担当者ID』と『サブ担当者ID』に相当する担当者名を、 1つしか追加していない『社員情報』テーブルとの「結合線」によって同時に表示させることは、 残念ながらできません。 【詳細】 > テーブル1回の追加でメインとサブ両担当者の社員名を持ってくる方法はあるのでしょうか? 『メイン担当者ID-担当者ID』と『サブ担当者ID-担当者ID』の2つの結合線を作成すると、 それは「メイン担当者ID=担当者ID」と「サブ担当者ID=担当者ID」を同時に満たすレコード、 つまり「メイン担当者=サブ担当者」(兼任というか単独担当)を抽出することになります。 (大雑把に言ってしまえばAnd検索に相当する、と) ですので、現状のテーブル構成では、prius770cさんが既に行っているように、面倒でも 『担当者』テーブルは2回追加するのが、一般的(かつ結果表示も速い)です。 【その他の対応案】 ◆A案・『顧客情報』テーブルで担当者名を表示 『社員情報』テーブルのレコード数が多かったりすると、上記の方法よりも動作がもたついて しまいますが(汗)、『メイン担当者ID』と『サブ担当者ID』にコンボボックスを使用すると、 クエリなしでも対応できます。 『顧客情報』テーブルをデザインビューで開いて『メイン担当者ID』の行を選択したら、 『データ型』のコンボボックスの一番下にある「ルックアップウィザード」を指定して下さい。 後は、ウィザードに従って操作を行うことで、『社員情報』の担当者名を表示させるように することができます。 (『サブ担当者ID』についても、同様の操作を繰り返します) ※上記ウィザードを実行する代わりに、テーブルのデザインビューの左下の『ルックアップ』 タブで『表示コントロール』を「コンボボックス」にし、『値集合ソース』などを設定しても Okです。 (なお、ウィザードを使用した場合は、リレーションシップも自動で設定されます) なお、テーブルでこの設定を行うと、以降、同テーブルを元にしたフォームでフィールドリスト からのドラッグ&ドロップで『メイン担当者ID』を追加すれば、自動的にコンボボックスでの 表示になります。 また、テーブルではあくまでIDの数値を表示したいという場合は、同テーブル1個だけを 追加したクエリで、『メイン担当者ID』のプロパティシートの『ルックアップ』タブで、同様の 設定を行えばOkです(残念ながらウィザードはないので手動になりますが)。 (クエリ上でIDと担当者名の双方を表示したい場合は、コンボボックスでの表示を設定 した側の『フィールド名』欄を、「メイン担当者ID」から「メイン担当名: メイン担当者ID」 と、「フィールド名として表示したい名前」+「半角コロン(:)」を追加してやります) ◆B案・担当者情報の記録方法を変える ※こちらの方法は、実際にはテーブル構成の全面改修になってしまいます。 あくまで、今後の参考情報ということで概略だけ・・・(汗) 顧客に対して複数の担当者が置かれる場合は、「顧客情報」部分と「担当者情報」 部分を別テーブルとして、1対多の関係にした方が、他のテーブルとの連携が簡単に なりますし(→メイン/サブの担当者に対して、1つの『社員情報』テーブルの追加で対応 可能)、担当者の数が3人、4人・・・と増えても、『担当者情報』テーブルへのレコード 追加だけで対応できます。 (「担当者が5人になったから『社員情報』テーブルを5個追加しないと・・・」なんてことに ならないで済む、と) ※この場合、単純な選択クエリだと、「1つの顧客のレコード数=その顧客の担当者の人数」 になります。 (「1顧客1行」にする場合は、クロス集計クエリを使用することになります: 但し、この形での編集は不可、表示専用になります)
その他の回答 (1)
社員情報のテーブルには社員IDと社員氏名があるものとします。社員情報のテーブルをコピーして二つにします。仮にE,Fと呼びます。Fのテーブルの社員IDの項目名を「サブ社員ID」と変えて、E,Fは別のテーブルのように見せかけておきます。そこで三つのテーブルの間でリレーションを組みます。メインテーブルを、仮にDと呼びます。Dのメイン担当社員IDとEのテーブルの社員IDの間に結合線、もうひとつはDのサブ担当社員IDとFのサブ社員IDの間に結合線を引きます。 そこで三つのテーブルを入れたクエリーをつくり、クエリーを実行します。不要な項目は非表示にしたり、並べる順序は自由に変えられます。このことはすでにご存知と思います。これで一度に目的の表がつくれます。
お礼
回答と対策案ありがとうございます。 基本的な自分の考え方が誤っていないくてホッとしました。 対策案の二つ目は確かに出来そうなのですが、残念ながら顧客情報テーブルの定義は決まって しまっています。(既存システムのテーブルをリンクしているため) でも、勉強になりましたありがとうございます。