• ベストアンサー

Access、同じテーブルの2つの項目対他のテーブルで1つの項目のリレーションは可能?

Accessで販売管理をしています。 以下のテーブルを作成し(*は主キーです)、 [売上T]  [商品M]  [顧客M]  [受注T] *売上NO  *商品ID  *顧客ID1  *受注NO 商品ID   商品名    *顧客ID2  商品ID 日付    顧客ID1     顧客名    受注日 金額    顧客ID2            受注金額        受注先1        受注先2 参照整合性にチェックを入れリレーションでつないでいます。 リレーションシップは下記のとおりです。 [売上T]商品ID―[商品M]商品ID―[受注T]商品ID [商品M]顧客ID1及び2―[顧客M]顧客ID1及び2―[商品M]受注先1及び2 ここで顧客と受注先が重複することもあるので、顧客Mから顧客ID及び受注先IDの2つのテーブルにリレーションシップを設定しているのですが、 クエリで  [受注T]受注NO及び受注金額、[顧客M]顧客名で抽出したところ、 5000件以上[受注T]にデータがあるはずのものが、1200件ほどしか抽出できませんでした。 ちなみに[顧客M]と[受注用顧客M]というまったく別のテーブルを作成し、 [商品M]受注先1及び2―[受注用顧客M]顧客ID1及び2 とリレーションを作成し、クエリで抽出するとうまくいきました。 しかしこの方法だと、[顧客M]と[受注用顧客M]という2つのテーブルを管理しなければならなくなるので面倒です。 そこで質問です。 同じテーブルの2つの項目対他のテーブルの1つの項目とでは、うまくリレーションが設定できないのでしょうか。 もし出来ない場合、[顧客M]と[受注用顧客M]の2つのテーブルを管理しなければならない訳ですが、 なんとか簡単に管理できる方法(ひとつのテーブルを変更すると簡単にもうひとつが変更できる設定)はないでしょうか。 非常にわかりにくく長い文章で申し訳ありません。 VBA等はさっぱりわかりませんので、普通の設定の範囲内で、できるかどうかよろしくお願いします。

noname#128382
noname#128382

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

  • ベストアンサー
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.3

リレーションシップとクエリでの結合を混同していますね >ちなみに[顧客M]と[受注用顧客M]というまったく別のテーブルを作成し >[商品M]受注先1及び2―[受注用顧客M]顧客ID1及び2 >とリレーションを作成し、クエリで抽出するとうまくいきました。 クエリでこのように結合すればいいだけですから、[受注用顧客M]など作らず クエリデザインビューに顧客Mを2度ドロップすればいいのです

noname#128382
質問者

お礼

回答ありがとうございます。 >リレーションシップとクエリでの結合を混同していますね どうやらそのようだったようです。 仰る方法で試してみたのですが、 デザインビューで作るとなぜか顧客名だけちがいその他は同じようなデータが重複し、 うまく作れなかったので、ウィザードから作成し、SQLビューで (顧客M.顧客ID1=装置M.顧客ID1)を(顧客M.顧客ID1=装置M.受注先1)に直すとうまく受注先を抽出することが出来ました。 なぜデザインビューでうまく結合できないのか、疑問は残りますが。

その他の回答 (2)

noname#140971
noname#140971
回答No.2

訂正: ×受売上金額______通貨型 ○売上金額______通貨型

noname#140971
noname#140971
回答No.1

1、各テーブルの主キーは[ID]、[XXNO]で統一。 2、連結列は、[テーブル名_主キー列名]で統一。 <商品M> ID___________長整数 商品名_____テキスト型 <顧客M> ID___________長整数 顧客名_____テキスト型 <受注T> 受注NO____長整数 受注日_____日付/時刻型 顧客M_ID__長整数 商品M_ID__長整数 受注金額__通貨型 <売上T> 売上NO___________長整数 売上日____________日付/時刻型 受注T_受注NO__長整数 受売上金額______通貨型 実際にデータを登録してみます。 <商品M> ID___商品名 1____A商品 2____B商品 <顧客M> ID___顧客名 1____鈴木 一郎 2____中村 主水 <受注T> 受注NO___受注日_________顧客M_ID____商品M_ID___受注金額 101________2007/09/10___鈴木 一郎___A商品_______\2,000 102________2007/09/11___中村 主水___B商品_______\3,000 <売上T> 売上NO___売上日_________受注T_受注NO___売上金額 101________2007/09/18___101_________________\2,000 102________2007/09/19___102_________________\3,000 これじゃ、誰に何を売上げたのか判りませんので、<売上_クエリ>を作成してみます。 売上NO___売上日_________顧客名________商品名___売上金額___受注NO 101________2007/09/18___鈴木 一郎___A商品_____\2,000______101 102________2007/09/19___中村 主水___B商品_____\3,000______102 問題は、<受注T>=<売上T>という設計にするか否かでしょう。 ・<受注T>参照方式として開発できるか否か? ・<受注T>非参照方式とし<受注T>の存在を必須としない方が利便性が高いか否か? <売上T> 売上NO___________長整数 売上日____________日付/時刻型 顧客M_ID__長整数 商品M_ID__長整数 受売上金額______通貨型 と、このように、マスターはマスター、入力テーブルは入力テーブルとテーブルを明瞭に分ければ・・・。

noname#128382
質問者

お礼

回答ありがとうございます。 とてもわかりやすく書いてくださりありがとうございました。 この方法は手間はかかりますが、わかりやすく間違えることはないですね。 まだテーブルの正規化等わかっていないのでどの方法がいいのかわかりませんが、よく理解して検討したいと思います。

関連するQ&A

  • accessで、2テーブル間で複数のリレーションをしたい

    access初心者です。 2テーブル間で複数のリレーションをしたいと思うのですが、どうすればよいのでしょうか? 下記例で「担当者」と「対応具体的内容」を結びつける一覧を抽出をしたいのです。 対応のたびに(対応日付ごとに)担当者が違います。 「対応具体的内容」は「対応内容区分」ごとに分け、各担当者が入力している。 擬似例) テーブル1: 顧客ID 対応日付 担当者   テーブル2: 顧客ID 対応日付 対応内容区分 対応具体的内容 こんな感じで、作られてしまっています。 顧客IDでのリレーションで、「テーブル1」の対応日付で抽出すると、担当者と対応具体的内容は一致しません。(1担当者に過去の全ての対応内容が抽出される) また、「テーブル2」の対応日付で抽出すると、その日付の対応内容に対し、過去全ての担当者が抽出されてしまいます。 担当者と対応具体的内容を結びつける為には、 顧客IDと対応日付とを一致させる必要があるように思うのです。 御教授よろしくお願いします。

  • リレーションシップが作成できなくなりました

    Accessにて、受注管理システムを構築しているのですが 何かの拍子で、リレーションシップが壊れてしまい 再度設定しようとしても 「このリレーションシップを作成して、参照整合性を設定できません」と表示されできません。 テーブルは3つあり、以下の通りになっています。 ・顧客管理テーブル(顧客IDと氏名・住所など) ・売上情報テーブル(受注IDと、顧客IDなどの情報) ・売上明細テーブル(明細IDと、受注IDなどの情報) 問題の箇所は、売上情報テーブルと売上明細テーブルで 売上情報テーブルの「受注ID」と売上明細テーブルの「受注ID」 を結びつけようとすると、上記のメッセージが出てきてしまいます。 一通り、主キーの設定や空白行などはチェックしてみましたが やはり解決しませんでした。 一度壊れてしまったリレーションシップは修復不可能なのでしょうか・・・ どなたか、お知恵を拝借願います。

  • リレーションシップの設定について

    リレーションシップの設定について Access2002にて受注管理を行っており テーブル、フィールドが次のように存在しています。 <T_納入先>  顧客ID  納入先コード  住所等情報... <T_顧客>  顧客ID  住所等情報... <T_売上情報>  受注ID  顧客ID  売上日やその他情報... <T_売上明細>  受注ID  明細や金額等... ---------- <T_顧客>に登録した顧客は複数の納入先を持つため [<T_顧客>の顧客ID 対 <T_納入先>の顧客ID]を[1 対 多]にてリレーションシップを作成しています。 <T_売上情報>の顧客IDと、<T_顧客>の顧客IDを[1 対 1]にて リレーションシップを作成しています。 ---------- ここで売上情報を登録するために「売上入力フォーム」なるものを作成し、 顧客IDや納入先の指定、売上日の記録や売り上げた明細を登録したいのですが 明細の入力部分は、サブフォームを作成し、<T_売上情報>と<T_売上明細>のクエリで問題ないのですが このフォーム自体のレコードソースとして使用するために <T_納入先><T_顧客><T_売上情報>の3つのテーブルの情報を含んだクエリを 作成したのですが、クエリ作成後、実行してもレコードが一切表示されません。 (おそらく<T_顧客>の中にさらに納入先が複数ある部分が うまくリレーションシップできていなくて矛盾を起こしているのでは・・と思ったのですが。) もちろん<T_納入先>と<T_顧客>のみであれば問題なくクエリは実行し、レコードも表示されます。 ある一つの顧客情報内にも複数の情報(=納入先)がある場合、 リレーションシップの設定はどのようにすればよいでしょうか。 長々とありますが、お分かりのかた是非とも教えて下さい。 よろしくお願いいたします。

  • Access リレーションが分かりません。

    こんにちは、Access初心者です。 現在の受注テーブルをIDベースでCSVでエクスポートするシステムを追加しようと思っているのですがイメージがわきません。 同じデータベースにCSVテーブルを新規で追加し受注テーブルのIDとCSVテーブルの受注IDを一対多でリレーションをしました。(受注テーブルにはデータが入っていますがCSVは新規です。) 受注テーブル ID:オートナンバー 納期:日付 品番:テキスト 数量:数値 CSVテーブル ID:オートナンバー 状況:テキスト...未と済をコンボボックスで選択式 受注ID:数値 メインフォームでCSVテーブルの状況ベース、受注テーブルの納期ベースでデータを抽出 サブフォームで上記条件のデータが見れるように作ろうとしました。 ですが、サブフォームクエリの段階でデータが新規入力レコードしか表示されてきません。 どうしたら、受注テーブルの一つ一つのレコードにCSVテーブルのレコードが結びつけられますか。 ど素人ですみません。

  • Access2007の複数値からの抽出方法に関して教えて下さい。

    Access2007の複数値からの抽出方法に関して教えて下さい。 お世話になります。 Access2007にてデータベースを作成中です。 リレーションさせている既に入力済みの複数値を参照し 同テーブルの他のフィールドの抽出条件を指定する方法を教えて下さい。 現在、三つの下記テーブルがあります。 T_管理テーブル T_取引先テーブル T_取扱商品テーブル T_管理テーブルには 管理ID、取引先ID、商品ID T_取引先テーブルには 取引先ID、商品ID、取引先社名 T_商品テーブルには 商品ID、商品名 のフィールがあります。 取引先テーブルの商品IDと商品テーブルの商品IDは リレーションさせています。 また管理テーブルの取引先IDと取引先テーブルの取引先IDも同様です。 取引先テーブルの商品IDには選択した商品によって 複数値(001,002など)が入力されています。 この複数値を元に管理テーブルで商品IDを選択する際に 取引先テーブルの商品IDに入力されたものだけを リストアップして、かつひとつの値を入力するにはどうしたら良いでしょうか。 管理テーブルにおいて商品IDに関しては、ひとつの値しか選ぶ事はありません。 実際にはフォームでは商品IDでは無く、選択時は商品名を表示しています。 最終的に商品名を修正した際には全ての商品ID入力個所において 更新がなされるように出来ればと考えています。 何卒、宜しくお願い致します。

  • アクセス2000 ファイルの結合

    t_顧客情報、t_購入明細の2つのテーブルを顧客ID(オートナンバー)でリレーション設定し、管理しています。テーブルもフォームもまったく同じファイルが2つあり、それぞれにデータが入っています。顧客IDはどちらとも「000001」からついています。この2つのファイルのデータを1つのテーブルへデータを結合したいのですが、どのような手順で行えばよいでしょうか。アドバイスお願いします。

  • Accessで複数テーブルのJoin

    次のようなテーブル(T1~T4)とクエリ(Q1~Q2)があります。 クエリの表で囲っているものはAccessのQBEを表しています。 その下はAccessが自動生成したSQLです。 Accessがある場合はいいのですが、ない場合、いきなりSQLを 書かないといけないわけですが、どのような順番に並べていって いいのか整理がつきません。 4つ以上になるとさっぱりです。 何かヒントをいただけませんでしょうか? T1:売上表[売上No、日付、顧客CD] T2:顧客表[顧客CD、顧客名] T3:売上明細[ID、売上No、連番、商品CD、数量] T4:商品表[商品CD、商品名、単価] Q1: ┌────────────────┐ │日付 │ 商品名│単価 │数量 │ ├────────────────│ │売上表│商品表│商品表│売上明細│ └────────────────┘ SELECT 売上表.日付, 商品表.商品名, 商品表.単価, 売上明細.数量 FROM 商品表 INNER JOIN (売上表 INNER JOIN 売上明細 ON 売上表.売上No = 売上明細.売上No) ON 商品表.商品CD = 売上明細.商品CD; Q2: ┌────────────────────┐ │日付 │ 顧客名│商品名│単価 │数量 │ ├────────────────────│ │売上表│顧客表│商品表│商品表│売上明細│ └────────────────────┘ SELECT 売上表.日付, 顧客表.顧客名, 商品表.商品名, 商品表.単価, 売上明細.数量 FROM (商品表 INNER JOIN (売上表 INNER JOIN 売上明細 ON 売上表.売上No = 売上明細.売上No) ON 商品表.商品CD = 売上明細.商品CD) INNER JOIN 顧客表 ON 売上表.顧客CD = 顧客表.顧客CD;

  • Access2003 リレーションされたサブフォームの抽出

    Access顧客情報のデータベースを正規化(VBA)している初心者です。リレーションされているテーブルを元にクエリ(3つのテーブルをつなげただけ)を作成しメインフォームにサブフォームを作りました。3つのテーブルは、1対多でリレーションされています。テーブルAのGR_IDやグループ名で検索しそれに紐づいているCOmpanyは抽出できるのですが、サブフォームのテーブルBのCOmpany nameから抽出することができません。メインフォームからオプションボタンを使用してメインとサブの両方のテーブルを検索したいので、子・親リンクの設定をはずせませんよね?以前の類似質問で「サブフォームのフィルターに入力し、フィルター実行でうまくいきました」とありましたが、具体的にどのように設定(マクロやVBA、再クエリ?)すればいいのかわからず悩んでいます。どうぞ初心者向きのアドバイスをよろしくお願いいたします。 テーブルA GR_ID グループ名 ※テーブルA(1):テーブルB(多) テーブルB GR_ID Company_ID Company name ※テーブルB(1):テーブルC(多) テーブルC Company_ID salesman

  • FMPのリレーション機能について

    初心者なので 愚問と笑われるかもしれませんが A(顧客台帳)、B(売上台帳)C(月集計)ファイルがあります。Bfileを入力する場合は、顧客IDで 顧客台帳からリレーションを設定して 問題ないのですが 月集計を 売上台帳から 集計しようとすると顧客IDは キーになっているので いいのですが 顧客名等が リレーション設定できません。私のどこが間違っているのでしょう?

  • Access2000のリレーションシップのエラーについて

    どのくらい説明すればいいのかわからないのですが、アクセス2000でリレーションシップの設定をするときに、 「主テーブルで参照されているフィールド用の固有インデックスがありません。」 というエラーメッセージが出てきてリレーションを作る事が出来ません。 問題なのは3つのテーブルのリレーションなのですが、それぞれのインデックスをチェックすればいいのだとは思いますが、対象となったフィールドは主キーではないので、重複は許可していますが、一応どちらもインデックスは作成しています。 どのようなリレーションシップかというと、業者テーブルと商品テーブルと販売履歴テーブルのリレーションで、 商品テーブルの業者IDと業者テーブルのIDのリレーション→左内部結合(商品テーブルの全フィールドに入れる) 業者テーブルの業者IDと販売履歴の業者IDのリレーション→右内部結合 は出来るのですが、商品テーブルの商品名と値段フィールドと、販売履歴の対応する部分についてのリレーションについてもたせようとするとエラーが出てしまいます。このようなリレーションはいらないのでしょうか? どちらも固有の値でない量のリレーションだからなのでしょうか? この二つのフィールドの参照整合性をどう保てばいいのか教えて下さい。

専門家に質問してみよう