こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

クエリ作成でどちらのフィールドが正解ですか

Access初心者です。
Access2010の学習をしています。

主キーと外部キーで関連付けられた
フィールドをクエリで抽出する場合、
デザイングリッドにドラッグするフィールドは、
どちらのフィールドを選べばよいのでしょうか?

----
「T担当者マスタ」と「T得意先マスタ」をもとに
「Q得意先マスタ」を作成したい場合です・・・

「T担当者マスタ」のフィールド

担当者コード(主キー)
担当者名


「T得意先マスタ」のフィールド

得意先コード(主キー)
得意先名
フリガナ

住所
TEL
担当者コード(外部キー)
担当者名


デザイングリッドにドラッグするフィールド

得意先コード
得意先名
フリガナ

住所
TEL
担当者コード(※主キーのフィールドを選ぶのは不正解ですか?)
担当者名

-----

担当者コードは元となるテーブルの両方に存在する
わけですが、どんな理由でどちらを選ぶのか
理解できません。
テキストの問題なのに情けないです・・

ご教授ください。

投稿日時 - 2014-06-21 10:41:06

QNo.8647035

困ってます

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

> 言葉足らずですみません。
> 「T担当者マスタ」の「担当者名」と
> 「T得意先マスタ」の「担当者名」をリレーションシップでリンクしています。

それは間違いですね。
それでは、参照整合性に「チェック」を入れることができないはずです。

主キーと外部キーをリンクさせる必要がありますので、
担当者コード 同士でリンクさせないとだめです。

投稿日時 - 2014-06-26 13:20:32

お礼

間違えていました!

「担当者コード」と「担当者名」を
整理できていませんでした。

ご回答いただいて、間違えていることを理解できました!

・主キーと外部キーをリンク
・担当者名を複数個所に設けない リンクされていない重複するフィールドだから


まともな質問になっていなかったのに
親切に教えていただき、本当にありがとうございます!!

投稿日時 - 2014-06-26 15:05:26

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

> >通常は得意先ごとの担当=期間×担当者で組みます。
>
> 設定としては、「T得意先マスタ」に、期間フィールドを設ければ
> 良いのでしょうか?

担当の履歴を残したいとなると、
担当者 と 得意先 の関係は、多対多の関係になりますので、中間テーブルが必要になります。

T得意先マスタとT担当者マスタとは別に下記のテーブルを作成してください。

T担当履歴
---------
得意先コード (外部キー)
担当者コード (外部キー)
開始日
終了日

これとは別に、
No.3の回答者さんも言われてますが、現行担当者 のフィールドを、T得意先マスタ に置いておくのは有効な方法だと思います。

投稿日時 - 2014-06-26 15:24:51

お礼

なるほど。
テーブルを増やせばいいのですね!

ありがとうございます。

投稿日時 - 2014-07-01 10:52:50

ANo.3

蛇足ですが、

得意先に対する担当者は永続的に同じというわけではないので
通常は得意先ごとの担当=期間×担当者で組みます。
そうでないと来月から担当が変わる・・・などのデータが設定できず
担当が変わる瞬間にメンテをしないというあわただしい仕組みになります。
(また過去の担当の履歴もあればあったで便利でしょう)

もちろん得意先テーブルの各データに現行担当の担当者コードを埋め込んでおくと
検索性が向上するので有効です。
その場合は、期間×担当→現行担当を更新する処理がデイリーのバッチで行うことになります

投稿日時 - 2014-06-23 14:00:30

補足

ご回答ありがとうございます!

>通常は得意先ごとの担当=期間×担当者で組みます。

設定としては、「T得意先マスタ」に、期間フィールドを設ければ
良いのでしょうか?

投稿日時 - 2014-06-26 13:14:59

ANo.2

まずは、テーブル設計が少し間違っいます(正規化されていない)。
「T担当者マスタ」に「担当者名」があり、「T得意先マスタ」にも「担当者名」がありますが、
「T得意先マスタ」の「担当者名」は不要ですので削除してください。
データベースではリンクするフィールド以外は重複する値が複数箇所に存在してはいけません。

さて、本題ですが、
どちら表示させていいいといえばいいのですが、
通常は、T得意先マスタ を表示させます。

理由としては、両方表示させて、それぞれのフィールドを更新してみれば分かりますが、
T担当者マスタ の 担当者コード を更新しようとしても更新できません。
(整合性矛盾を防止のためにロックがかかる)

T得意先マスタ の 担当者コード の方は更新できる。コードを更新するとそれにともなって担当者名も自動で変わります。
通常はこの方が好ましいと思います。

このように外部キーを表示させて、それに対応するマスターのデータを表示させるものをオートルックアップクエリと言って、よく使われるものです。

オート ルックアップ クエリを作成するには
http://support.microsoft.com/kb/879978/ja

投稿日時 - 2014-06-22 01:02:44

お礼

ご回答ありがとうございます。


>データベースではリンクするフィールド以外は重複する値が複数箇所に存在してはいけません。

言葉足らずですみません。
「T担当者マスタ」の「担当者名」と
「T得意先マスタ」の「担当者名」をリレーションシップでリンクしています。

>(整合性矛盾を防止のためにロックがかかる)

実際にフィールドの更新をして、確認しました。
なるほどです。納得のできる理解です。

学習をすすめてみます。

投稿日時 - 2014-06-26 12:28:54

ANo.1

「得意先には一人の担当者がいる」なんですね?

どちらでも良さそうだが、私なら 「担当者マスタ」のほうを使う。
「そのクエリ」を作る目的は「担当者が担当している得意先のリストを作るため」だから。

OUTER JOINの場合等、参照整合性に不都合があって結合できない事態があっても
表示されるのは「担当者マスタ」の値だから。

投稿日時 - 2014-06-21 12:08:27

お礼

なるほど、そう考えるとしっくりきます。
目的を考えると理解できました。
ありがとうございます!!

運用面での考慮がポイントなんですね。

投稿日時 - 2014-06-26 12:14:02

あなたにオススメの質問