クエリで同一テーブルの複数回参照について

このQ&Aのポイント
  • 顧客情報の入ったテーブルにメイン担当者IDとサブ担当者IDがあり、別テーブルの社員情報から社員名などを引っ張ってくるクエリを組んでいます。
  • 現在は、メイン担当者名とサブ担当者名を持ってくる為に社員情報を2回追加して、それぞれで両方にある担当者IDをキーにして結合させているのですが、テーブル1回の追加でメインとサブ両担当者の社員名を持ってくる方法はあるのでしょうか?
  • まだ、ACCESSを勉強中のため色々と調べてみましたが知識不足のためか出来る出来ないの判断も出来ませんでした。出来ないなら諦めがつくのですが、もし1回の追加で済むならその方がシンプルで良いと思うのでもし方法があるようでしたら教えていただければと思います。
回答を見る
  • ベストアンサー

クエリで同一テーブルの複数回参照について

顧客情報の入ったテーブルにメイン担当者IDとサブ担当者IDがあり、別テーブルの社員情報から 社員名などを引っ張ってくるクエリを組んでいます。 現在は、メイン担当者名とサブ担当者名を持ってくる為に社員情報を2回追加して、それぞれで 両方にある担当者IDをキーにして結合させているのですが、テーブル1回の追加でメインとサブ両担当者の社員名を持ってくる方法はあるのでしょうか? まだ、ACCESSを勉強中のため色々と調べてみましたが知識不足のためか出来る出来ないの判断も出来ませんでした。 出来ないなら諦めがつくのですが、もし1回の追加で済むならその方がシンプルで良いと思うのでもし方法があるようでしたら教えていただければと思います。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.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行」にする場合は、クロス集計クエリを使用することになります:   但し、この形での編集は不可、表示専用になります)

prius770c
質問者

お礼

回答と対策案ありがとうございます。 基本的な自分の考え方が誤っていないくてホッとしました。 対策案の二つ目は確かに出来そうなのですが、残念ながら顧客情報テーブルの定義は決まって しまっています。(既存システムのテーブルをリンクしているため) でも、勉強になりましたありがとうございます。

その他の回答 (1)

noname#192382
noname#192382
回答No.1

社員情報のテーブルには社員IDと社員氏名があるものとします。社員情報のテーブルをコピーして二つにします。仮にE,Fと呼びます。Fのテーブルの社員IDの項目名を「サブ社員ID」と変えて、E,Fは別のテーブルのように見せかけておきます。そこで三つのテーブルの間でリレーションを組みます。メインテーブルを、仮にDと呼びます。Dのメイン担当社員IDとEのテーブルの社員IDの間に結合線、もうひとつはDのサブ担当社員IDとFのサブ社員IDの間に結合線を引きます。 そこで三つのテーブルを入れたクエリーをつくり、クエリーを実行します。不要な項目は非表示にしたり、並べる順序は自由に変えられます。このことはすでにご存知と思います。これで一度に目的の表がつくれます。

関連するQ&A

  • ACCESSで複数テーブルのクエリ抽出

    ACCESSで複数テーブルのクエリ抽出 初めて投稿させてもらいます。 テーブル1・・・社員ID(主キー)、氏名 テーブル2・・・社員ID(重複キー有)、顧客ID テーブル3・・・社員ID(重複キー有)、得意先ID テーブル4・・・顧客ID、顧客氏名 テーブル5・・・得意先ID、得意先 上記のテーブル内容を1つのクエリで全部抽出するとき、 テーブル1の社員ID[a]とテーブル2の社員ID[a] と テーブル1の社員ID[a]とテーブル3の社員ID[a] を分けて抽出する方法ってありますか? クエリの結合プロパティで テーブル2の全レコードとテーブル1の同じ結合フィールドと テーブル3の全レコードとテーブル1の同じ結合フィールドにすると 「あいまいな外部接続が含まれているのでSQLを実行出来ません」とエラーになり、 テーブル1の全レコードとテーブル2の同じ結合フィールドと テーブル1の全レコードとテーブル3の同じ結合フィールドにすると 社員ID[a]、顧客ID[1]、得意先ID[α]、顧客氏名[吉田]、得意先[○○商事] 社員ID[a]、顧客ID[1]、得意先ID[β]、顧客氏名[吉田]、得意先[△△金融] みたいになってしまうのです。 やりたい結果は 社員ID[a]、顧客ID[1]、得意先ID["空欄"]、顧客氏名[吉田]、得意先["空欄"] 社員ID[a]、顧客ID["空欄"]、得意先ID[β]、顧客氏名["空欄"]、得意先[△△金融] 説明下手ですいませんが、ご教授の程よろしくお願いします。

  • access での値参照およびコピー

    はじめまして、 どなたかアクセス2007での処理方法を教えてください。 アクセス初心者です。よろしくお願いいたします。 以下のような3つのテーブルがあります。 salesテーブルはcsvファイルをインポートしたワークテーブルです。 テーブル名:sales(ワークテーブル) 受注番号 名前   住所 3   さぶろう 長野県 4   しろう  愛知県 ここから追加クエリで以下のテーブルにデータを追加しました。 (ID12と13、IDはオートナンバーです。) テーブル名:顧客マスター 顧客ID 名前 住所  10 たろう 東京都 11 じろう 神奈川県 12 さぶろう長野県 13 しろう 愛知県 そして以下のテーブルにも追加クエリでワークテーブルの情報を追加しました。 テーブル名:受注情報(受注番号3と4を追加) 受注番号 顧客ID  商品名 1    10   りんご(すでにあるデータ) 2    11   ばなな(すでにあるデータ) 3         りんご(今回ワークテーブルから追加したデータ) 4         みかん(今回ワークテーブルから追加したデータ) 上記の場合で、受注情報テーブルに顧客IDを挿入するには どのような方法で追加すればよいのでしょうか? ワークテーブルの中に顧客IDはないので単純な追加クエリでは できなのでどうやったらよいか分かりません。 (顧客テーブルと受注情報テーブルは結合されています。) 同姓同名を避けるためにsalesテーブルの名前&住所と顧客マスターテーブルの 名前&住所を比べて、同じものの顧客IDを受注情報テーブルの顧客ID欄に入れたいのです。 そうすると顧客テーブルと受注情報テーブルの顧客IDのリレーションシップに矛盾が 起きないのではないかと思っています。 よろしくお願いいたします。

  • 複数のテーブルに対して・・・

    過去に同様の質問があったかも知れませんが、Accessのバージョンがかなり古いので質問させて下さいね。 Access97(すみません、ホント古くて…)で、下のような顧客情報管理ファイルを作成しました。 テーブルA<→フォームA> ・顧客ID(主キー: テキスト型) ・氏名 ・情報A1, A2~ ・入力フォームB~への移動ボタン(同一IDレコードの表示) テーブルB<→フォームB> ・顧客ID(主キー: テキスト型) ・情報B1, B2~ テーブルC<→フォームC> ・顧客ID(主キー: テキスト型) ・情報C1, C2~ 最初からテーブルA~Cを結合したものを作ればよかったのですが、 それぞれのテーブルについて細かい入力項目が30~40個あるため、 分割して作成してしまいました(そして今後もテーブルは増える可能性大です)。 現在、テーブルAにだけ、20人分のデータが入っています。 今後も顧客数やテーブルが増える予定なのですが、 その都度テーブルごとに顧客IDをいれるのが面倒になってきました。 そこでお訊ねしたいのですが、テーブルA(を元にしたフォームA)に顧客IDを入れると、 テーブルBやCにも同じテキストが入力されるような設定は可能でしょうか。 最初、クエリーで連結しようとしたのですが、 既にテーブルAにいくつかデータが入っているせいか、どうも上手く反映されません。 単に私の参照方法が下手だったからかもしれませんが…。

  • Access:リンクテーブルでの参照、更新処理

    マスターmdbにメインとなるテーブルを置き (ID,課,担当者名,商品番号,商品名,価格・・・) 3課まであるのですが、各課の専用フォルダに編集するmdb (仮に編集mdbとします)を置いて メインテーブルをリンクし、同じフィールドを用意した編集用テーブルを置き、フォームやクエリを作成して作業しようとしています。 基本的に同じ顧客に一斉に手を加える事はないので 編集用テーブルに一旦格納したデータを追加クエリでリンクしたメインテーブルへ書き込み、削除クエリで編集用テーブルを綺麗にしています。 が。そもそも新規ばかりではなくメインテーブルに既存のデータを読み込んで編集したい事もあります。 この処理をどうしたら良いのか分かりません。誰かがメインテーブルを参照していたら他の人が見れないと思うし、1レコードだけ見るのであればそれだけ一旦編集用テーブルへ置けば良いのかと思いましたが、 一覧を見てソートしてみたりする事もあります。 管理者が全部のデータを掌握したいのでマスターmdbにメインとなるテーブルを置いたのですが、これを課ごとのテーブルに分ければ良いのでしょうか? Accessをいじればいじる程毎回発見がありますので、知らないだけで他に簡潔な方法などありましたら教えて下さい。宜しくお願いします。

  • Access 複数テーブルをまとめる

    こんにちは! 過去記事を検索しましたが、該当がなく、苦戦しております… お知恵をお貸し下さいm(__)m テーブル T顧客…顧客ID(主キー)、名前、… T書類1…顧客ID(重複キー有)、書類1ID、… T書類2…顧客ID(重複キー有)、書類2ID、… T書類3…顧客ID(重複キー有)、書類3ID、… T書類4…顧客ID(重複キー有)、書類4ID、…  ・  ・  ・ その他に複数同じような構造のテーブルがあります。 テーブル内には他に様々なフィールドがありますが、同一内容の結合できるフィールドは上記のみです。 上記のテーブルですべての書類IDを取ってきたいのですが、 全テーブルを顧客IDと結合し、選択クエリで抽出すると      顧客ID | 名前 | 書類1ID | 書類2ID | 書類3ID | 書類4ID  1  |  Aさん |  10  |  5 |  20  |  26  1  |  Aさん |  10  |  30 |  20  |  25  1  |  Aさん |  10   |  4 |  20  |  26  1  |  Aさん |  10   |  6 |   20  |  25  2  |  Bさん |  30  |  13 |  25  |  5  2  |  Bさん |  30   |  10 |  26  |  5  2  |  Bさん |  30   |  13 |  26  |  5  2  |  Bさん |  30  |  10 |  25  |  5 のような値が出てきてしまいます…当たり前の結果ですが… やりたいこととして、 (1)一つのテーブルかクエリで抽出 顧客ID   名前   書類1ID   書類2ID   書類3ID   書類4ID  1     Aさん   |  10  |  5  |  20  |  26               |     |  30  |     |  25               |     |  4               |     |  6    2     Bさん   |  30  |  13  |  25  |  5               |     |  10  |  26   のように重複をなくし、 (2)更にまとめたものにしたいです。 顧客ID   名前   書類1ID   書類2ID   書類3ID   書類4ID  1     Aさん     10     5,30,4,6     20     25,26  2     Bさん     30      10,13     25,26     5 最終的に上記にまとまったものをフォームにして、顧客IDごとに抽出し、 顧客ごとの各書類のIDはこれとこれですよ!みたいにしたいのです! 説明が下手で申し訳ありませんm(__)m Access初心者で、独学でコツコツやっているので、知識が乏しいです… 調べてみるとユニオンクエリとかでできるような記事はありますが、 SQL文なども理解ができずに苦戦しております… お手数ですが、ご教示の程 よろしくお願い申し上げます。

  • クエリーの抽出条件、テーブルの構成について

    LIbreoffic Base を使用しています。 クエリーでの抽出仕方を教えてください。 <例> 複数の顧客がいます。 顧客Aが1つの店舗で商品を購入した場合に合計金額に対して割引はありません。 顧客Aが2つの異なる店舗で同一日に商品を購入した場合に各店舗毎の合計金額を合算して10%の割引を行います。 顧客Aが3つの異なる店舗(以上)で同一日に商品を購入した場合に各店舗毎の合計金額を合算して20%の割引を行います。 テーブルからクエリーで抽出して 結果として顧客ごとに日別、月別、年別に 顧客 日付 金額の明細と金額の合計 割引額の明細を作成したい。 テーブルの構成 顧客テーブル  顧客ID 顧客名 商品デーブル  商品ID 商品名 商品単価 店舗テーブル  店舗ID 店舗名 明細テーブル  明細ID 顧客名 店舗名 商品名 日付 金額 各テーブルのプライマリーキーは顧客名、商品名 店舗名 明細IDです。 質問ですが 顧客名 日付 店舗名、金額の明細と金額の合計 割引額を日別、月別、年別に抽出し計算するしかたを教えてください。 特に各顧客か同一日に購入した店舗数によって割引率が異なるので、これをクエリーの抽出条件としてどう表現し明細にしたらよいかで行き詰っています。 テーブルの構成にはこだわっていません。変更すべき箇所があれば指摘してください。 よろしくお願いいたします。  

  • 更新クエリ、複数条件で置換え

    既存のレコードを新しいデータで上書き(置換え)したいです。 ただ、上書きする際に、いくつか加えたい条件があるのですが、 更新クエリのREPLACE文のヘルプを見てもよくわからなかった為 教えていただけないでしょうか。 ●やりたいこと ※テーブル table1(ID,顧客名,年齢,性別(男,女,不明)) table2(ID,顧客名) ※条件 table1.ID = table2.ID And table1.性別 = "不明" table1の"ID"のうち、table2に同じ"ID"があり、 さらにtable2の"性別"が「不明」の場合には、 table1の"年齢"をNULLに置き換える。 どうかお力を貸してください。 宜しくお願いいたします。

  • ACCESSで複数のテーブルで同じ内容の行を抽出

    いつもお世話になっておりあます。 ACCESSのクエリ作成でお聞きしたき件ありまして、 投稿させていただきました。 下記の様な商品購入テーブルA・Bで ・・・テーブル定義・・・ テーブルA 顧客ID 商品名 テーブルB 顧客ID 商品名 ・・・入力データ・・・ テーブルA 顧客ID 商品ID 0001  あめ 0002 コーラ 0003  せんべい テーブルB 顧客ID 商品ID 0001  おかし 0002 コーラ 0003  わたあめ ・・・・・・・・・・・ とのテーブルにて テーブルAとテーブルBの同じ状態の行 0002 コーラ を抽出するには、どのようなクエリを作成すればよろしいのでしょうか? 見当がつかず、こまっております。 どなたか、御対応いただけますと、ありがたいです。

  • Access クエリ このレコードセットは・・・

    いつもお世話になります。 Accessで下記の様にクエリを作成しましたが、”このレコードセットは更新できません”と出てしまいます。 ■テーブル1  ・顧客ID(主キー)  ・顧客名  ・住所  ・TEL ■テーブル2  ・顧客ID  ・取引ID(主キー)  ・請求金額 ■クエリ1(集計クエリ)  ・顧客ID グループ  ・請求金額合計: Sum(請求金額) 合計 ■クエリ2(実際に使用するクエリ)  ・顧客ID(テーブル1)  ・顧客名(テーブル1)  ・住所(テーブル1)  ・TEL(テーブル1)  ・請求金額合計(クエリ1) このクエリ2を開いて更新しようとしても、”このレコードセットは更新できません”と左下に表示されて更新できません。 ・請求金額合計(クエリ1)を除けば問題なく更新できます。 ですが1顧客に対して通算で幾ら請求をしたかとその顧客のデータを同一クエリで表示・更新したいので、意味をなさなくなってしまいます。 どなかた良い方法をご教授下さいませ。

  • テーブル・クエリ・フォーム どれがいい?

    アクセス初心者の為、よくわからないので教えてください。 テーブル1があり そこには ID(主キー/オートナンバー型) フィールド1(テキスト型)があります。 そのテーブルを基にクエリ1作成してます。 [SELECT テーブル1.* FROM テーブル1;] です。 また、テーブル1をレコードソースとしたフォーム1も作成しています。 そして図のようにメインメニューフォームを作成し それぞれのコマンドボタンを設置しました。 モジュールには --------------------------------------------------------- Option Compare Database Option Explicit Private Sub コマンド0_Click() DoCmd.OpenTable "テーブル1", acViewPivotTable End Sub Private Sub コマンド1_Click() DoCmd.OpenQuery "クエリ1", acViewPivotTable End Sub Private Sub コマンド2_Click() DoCmd.OpenForm "フォーム1", acFormPivotTable End Sub --------------------------------------------------------- と書いたので どのボタンを押してもピボットテーブルを開けます。 しかしどれか一つにしたいのですが 今後運用するにおいてどれで開けばいいのでしょうか? ピボットテーブルビューで開くならどれも同じでしょうか? 今回はピボットテーブルビューで表示していますが データシートビューでも表示させたい場合があれば 「フォームなら条件付き書式が設定できるからフォームが良いかなー」 と思っています。 確かテーブルやクエリでは条件付き書式はできなかったような・・・ 全てのビューで開くにおいて テーブル・クエリで開くメリットがあれば教えてください。 ご回答よろしくお願いします。

専門家に質問してみよう