現在初歩の初歩からAccessの勉強中です。

リレーションが何の為にあるのか、設定するのかはよく分かるのですが、内部結合・外部結合や1対多・1対1などがよく分かりません。

ここで全てを教えていただくわけには行かないと思いますが、本などをいくつか読んでもいまいちピンときません。
具体的にどういうケースでどのように設定するのかも分かりません。

どなたかご教授頂けませんでしょうか?
分かりやすい書籍・ホームページのご紹介でも結構です。

よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

RDB(リレーショナルデータベース)とはなんぞやてのわからないと内部結合・外部結合や1対多・1対1はわかんないかもしれませんね。


RDBは表形式のデータベースです。
受注伝票番号、受注日、顧客No、顧客名称、商品ID、商品名、納期、単価数量、合計金額等が受注伝票にあるとします。これをそのまま
受注伝票番号、受注日、顧客No、顧客名称、商品ID、商品名、納期、単価数量、合計金額等
の形式でEXCELシートに記入データとして登録すると受注伝票No等が重複して同じ値を記入することになりますね。
これを正規化という手法を使って重複する項目を無くすとmsystemさんのいうような複数のテーブルに分かれます。これを結合して元の状態に戻すのです。
ということでmsystemさんの補足です。
    • good
    • 0

まずはじめに、内部結合、外部結合は、実際にデータを取得する際に複数のテーブルからデータを持ってくるときに、どのようにデータを持ってくるかによって使い分けます。

1対多、1対1は、テーブル設計の際に、テーブルとテーブルのデータの関係を表現するのに使います。
ほとんどは、1対多なので、1対多のときに内部結合を使ってデータを取得したり、外部結合を使ってデータを取得したりすることになります。

例を書いてみます(わかりにくいかも・・・)

内部結合
 受注テーブル
受注番号    顧客ID   商品ID  数量
1 111 222 10
2 122 222 5
3 111 111 3
4 123 333 50

 顧客テーブル
顧客ID   顧客名   住所
111  A商事   ○○県・・・
122 B製作所  ××県・・・
123 C電気   △△県・・・
124 D事務所  □□県・・・

 商品テーブル
商品ID   商品名   単価
111     α    100
222 β 150
333 γ 50
444 δ 80

とテーブルがあったとします。
受注一覧を見るためには、受注テーブルと商品テーブルと結合する必要があります。このときに、受注テーブルの顧客ID、商品IDに番号がある顧客名と商品名だけ表示する必要があります。(つまり、D事務所と商品δは表示する必要がない)そのような場合、内部結合をします。(つまり、両方のテーブルに、データがちゃんとある分だけ結合する。)

外部結合
上記のテーブル構造で、顧客別の受注集計をする時に、受注のなかった顧客名を表示したいとき、全顧客を表示し、受注のある分だけ受注情報を表示します。これが外部結合です。

1対多
上記のテーブル構造で、顧客1件に付き、受注がひとつしかないことは珍しいですよね。つまり、顧客1つに対して受注が多数あるので「顧客テーブル」と「受注テーブル」は「1対多の関係」といいます。(設計時は逆も検討してください、受注1件に対して顧客が複数あると(この場合あまり考えられないが)多対多になります。

1対1
これは、普通あまり使うことはないのですが、あるテーブルのデータ1件に対して他のテーブルのデータ1件が対応する場合、(その逆も成立する場合)1対1の関係になります。
使うのは、たとえばマスター変換テーブルなどで使います。(上記の例だと、このデータベースの顧客IDが別のデータベースの顧客テーブルの顧客IDとが違う場合、その変換のために使います)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qリレーションの設定って意味あるのですか?

すみません、素朴な疑問です!

リレーションってプログラミング上どんな意味(利点)があるのでしょうか?

たとえば、下記のようにテーブル2つあり、PC種別コードで1:多で
リレーションが設定されていたとします。

■顧客テーブル     ■PCテーブル
氏名 PC種別コード   PC種別コード PC種別名
========    ============
田中 1        1      デスクトップ
佐藤 2        2      ノートブック
伊藤 2 

下記のようにフォーム上で表示する時、
氏名 所有PC種別名
==========
田中 デスクトップ
佐藤 ノートブック
伊藤 ノートブック

所有PC種別名は、リレーションの設定とはまったく無関係に
プログラミングで引っ張ってきませんか?
たとえば、PC種別コードをキーにDlookup関数を使ったりして。
あれ?SQLのSelect文で記述すれば勝手にキーを判断し結合して持ってきてくれるのですかね~?

まったくの基本中の基本の質問をして申し訳ありません。
どなたかこの素朴な疑問を解決してください。
よろしくお願い致します。

すみません、素朴な疑問です!

リレーションってプログラミング上どんな意味(利点)があるのでしょうか?

たとえば、下記のようにテーブル2つあり、PC種別コードで1:多で
リレーションが設定されていたとします。

■顧客テーブル     ■PCテーブル
氏名 PC種別コード   PC種別コード PC種別名
========    ============
田中 1        1      デスクトップ
佐藤 2        2      ノートブック
伊藤 2 

下記のように...続きを読む

Aベストアンサー

>リレーションってプログラミング上どんな意味(利点)があるのでしょうか?

事プログラミングに関しては、リレーションを設定していなくてもすべての事が問題なく出来ます。
開発の途中などは、リレーションの為に テストデータの作成や削除等ちょっとした操作に影響するので まったく設定せずに行うこともあります。
プログラミング上と言うよりも、データベースの管理上データを矛盾無く管理するのに役だちます。
テーブル間の関連付けにより、
・矛盾したデータの入り込みを防げる
・関連した項目の連鎖更新によりデータの整合性を保てる
・関連した項目によりレコードの連鎖削除ができデータの整合性を保てる

プログラミングと言う表現とはずれますが、クエリの作成画面でリレーションを設定しているテーブルを複数配置した場合 設定している結合の情報が静的に設定されます。

Q複数のカラムに対するリレーションについて

こんにちは、ER図の書き方(テーブル定義)について勉強しているのですが、皆さんにお聞きしたいことがあります。

ある学校が、毎年のマラソン大会の情報をDBで管理しようとしています。そのマラソン大会は、
・午前・午後それぞれ別のコースで1回ずつ実施する(参加者は同じ)
・コースの組み合わせは毎回ランダムに決定される
という条件で開催されます。

また、コースには難易度が設定されていて、その難易度は
・コース個別ではなく、2つのコースの組み合わせで決定される
・その日の天候(晴れか雨)によって変わる(午前・午後の天候は同一とする)
・50を平均とした100段階評価になっている
という条件を持っています。

以上を満たすテーブル構成として、どういったものが考えられるでしょうか?アドバイスをお願いいたします。

ちなみに、以下のようなものを考えてみました。

=======================================================

大会テーブル
━━━━━━━━━
開催日ID
午前コースID(FK)
午後コースID(FK)
天候

コーステーブル
━━━━━━━
コースID
距離

難易度テーブル
━━━━━━━
コース1ID(FK)
コース2ID(FK)
天候(FK)
難易度
=======================================================
この場合、「大会テーブル」と「コーステーブル」、または
「難易度テーブル」と「コーステーブル」は、それぞれ
2つのカラムでリレーションを持っていて、ER図を書くときに
線が2本(?)になりそうで、どうしようかと迷いました。

以上、よろしくお願いいたします。

こんにちは、ER図の書き方(テーブル定義)について勉強しているのですが、皆さんにお聞きしたいことがあります。

ある学校が、毎年のマラソン大会の情報をDBで管理しようとしています。そのマラソン大会は、
・午前・午後それぞれ別のコースで1回ずつ実施する(参加者は同じ)
・コースの組み合わせは毎回ランダムに決定される
という条件で開催されます。

また、コースには難易度が設定されていて、その難易度は
・コース個別ではなく、2つのコースの組み合わせで決定される
・その日の天候(晴れか...続きを読む

Aベストアンサー

なんとなく学校の宿題か研修の課題のような気がするので
中途半端な回答で失礼します。

ERモデルを考えるときは,一方のエンティティの主キーに対して
他方のエンティティが1なのか多なのか考えて線を引きます。
1対1:-----
1対多:----→
多対多:←---→

ということで,1本の線で関係を表します。さて,どれを使いましょう?

Qファイルメーカーの再帰定義/リレーション機能について教えて

ファイルメーカーの再帰定義とはどういう事なのか教えてくれませんか?
リレーションのデータの取込みの際、再帰定義と表示されデータがリレーションできないのです。詳しくはファイルが「受注」「発注」「仕入れ」「請求書」と4つありまして、そのフィールド(商品等)を4つのファイル全部にリレーションさせたいのですが、「受注」→「発注」→「仕入れ」まではデータを読込めたのですが、再帰定義と表示されその先の「請求」ファイルまでリレーションできません。どうすればリレーションできるのかも併せて教えて頂けませんか?宜しくお願いします。

Aベストアンサー

「再帰定義」とは計算式の間違いなどでエラーメッセージとして出てきます。どういうことかというと、AフィールドにBフィールドのデータを引用するにあたって、実はBフィールドはAフィールドのデータを何らかの形で引用していたため定義ができない、というような感じの意味です。
4つファイルのリレーションの場合、何か共通の1つのキーで他の3つにリレーションするのは良いのですが、「受注」→「発注」→「仕入れ」とデータがリレーションされた段階でこの3つのファイルのいずれかが「請求書」のデータを引用していると思われます。
この辺を考慮して再度ファイル定義をよく見直して下さい。
回答が遅かったのでもう既に解決していれば幸いです。

QGROUP BY 句を使う時のWHERE と HAVINGの使い方の違いがいまいちよく分かりません

SQL文でグループ化して、かつ抽出条件を
指定する時、WHERE を使うか HAVING を
使うかの違いがよく分かりません・・・。

どなたか分かりやすく教えて頂けませんでしょうか?

Aベストアンサー

こちらの前半部分に目を通してみてください。
http://www.atmarkit.co.jp/fnetwork/index_index.html#sql

参考URL:http://www.atmarkit.co.jp/fnetwork/index_index.html#sql

Qリレーションの表示方法

MySQL4.1でテーブルを15つ作成して
リレーションを組みました。
でも本当に関連付けれたか心配なんですが
リレーションがちゃんとできているかを
確認するにはどうしたらいいですか?

Aベストアンサー

こんにちは。
MySQL4.1を触ったことがないので、勘違いをしているかもしれませんが、
アクセスみたいにリレーションを視覚的に組めるんですか?
確か3系とかではそんなことはできなかったので、SQL文の生成の段階でリレーションを組んでいましたが!!!
テーブル構造として作ったってことかな???
リレーションが組めているのであれば、そのリレーションを使ったSQL文を作ってデータを確認してみたら、関連付けができているかどうか、確認できます。

QAccess サブフォームのリレーションに関して

標記の件よろしくお願いします。

メイフォームとサブフォームを

メインフォーム ID オートナンバー型 主キー設定設定あり。

サブフォーム  ID 数値型(長整数) 主キー設定なし。

の条件でリレーションしてあります。

現状ではメイフォームのIDとサブフォームのIDを
を別々に手入力しています。

メインフォームのIDを入力したらサブフォームのIDが自動的に
同じ数値で表示されるような設定をするにはどのようにすれば
よいのでしょうか。

また、新規データを入力する際に
レコードセレクタにて空の入力欄を表示させて
前回のデータの入力を確定させているのですが

これ以外の方法はありますでしょうか?
この方法だと他の担当が操作した場合に
いつデータ入力が完了したのか
次のデータを入力するにはどうすればよいのか
分かりづらいのではないかと思います。

上記2点どちらかでも構いませんので
アドバイスお願いいたします。

Aベストアンサー

質問しようとしている状況が良く判りません。
通常、メインフォーム/サブフォームは、例えば「大分類/小分類」みたいなものがあり、メインフォームで大分類項目を選択すると、サブフォームにその大分類に属する小分類項目が一覧表示されるようなものを考えます。この場合、IDを手入力するような状況は考えられず、小分類項目を追加する場合には、該当するフィールドに、大分類のIDが自動的にセットされます。
ご質問の状況は違うようなので、具体例を交え、改めて状況を説明してください。

QFileMaker pro 11 リレーション本

FileMaker Pro 11で専門学校の学生管理DBを作成しています。
初心者のため、リレーションをどうやればよいか、よくわかりません。

現在使用中の本は
「FileMaker Pro11 スーパーリファレンス」(ソーテック社)のみです。

リレーションについて、「新リレーションで極める FileMaker」という本しかアマゾンで見当たらないのですが、2008年に出版された本で、バージョン9までの対応のようです。
この本は、バージョン11でも十分に対応できる内容なのでしょうか?
もし、問題ないようでしたら購入したいのですが、どなたか使っていらっしゃる方がおられましたら、教えてください。

また、他にPro11対応のリレーションについて詳しく学べるサイトや本がありましたら教えていただけると助かります。

Aベストアンサー

リレーションだけの本もあるのですか・・・
リレーションの基本はVer.7からほとんど変わっていないと思いますけど、
11(持ってないけど)ではポータルフィルターとか有るようですね。
リレーションのどんなところが判らないのですか?
市販本で解決するのかな。

QACCESS n対nのデーターを結合したいのですが・・・。

お知恵をかしてください。
Aテーブル
No   商品名  金額
1     AAA  1,111
3     CCC1  3,333
3     CCC2  3,333
5     EEE  5,555  
Bテーブル
No   商品名    金額
1    AAAAA   11,111
2    BBBBB   22,222
4    DDDDD   44,444
5    EEEEE1   55,555
5    EEEEE2  55,555

をNOで結合して
Cテーブル
AかBNo A商品    A金額     B商品   B金額
1     AAA    1,111    AAAAA  11,111
2     ブランク           BBBBB  22,222
3     CCC1    3,333    ブランク
3     CCC2    3,333    ブランク
4     ブランク          DDDDD   44,444
5     EEE     5,555   EEEEE1  55,555
5     ブランク          EEEEE2  55,555

というテーブルを作成したいのですが、(AテーブルBテーブルのNoが一緒だったら1行目は行を1行にしたい。)ということは可能でしょうか?
詳しい方教えてください。

お知恵をかしてください。
Aテーブル
No   商品名  金額
1     AAA  1,111
3     CCC1  3,333
3     CCC2  3,333
5     EEE  5,555  
Bテーブル
No   商品名    金額
1    AAAAA   11,111
2    BBBBB   22,222
4    DDDDD   44,444
5    EEEEE1   55,555
5    EEEEE2  55,555

をNOで結合して
Cテーブル
AかBNo A商品    A金額     B商品   B金額
...続きを読む

Aベストアンサー

Aテーブルを T1、BテーブルをT2、とし
[No] を [ID] とすると(No はAccessの予約語なので)
下記を新たなクエリのSQLビューに貼り付けてデータシートビューで見ると
両テーブルに含まれる番号だけの一覧がでてきます。
これを、Q1 とします
select ID from T1
union
select ID from T2;

でこのクエリを元にして。
もう1個新たなクエリを作ります。
先ほどのQ1とT1、T2 を入れて
Q1.ID ---→T1.ID
   \--→T2.ID のように結合線を引くとお望みの結果になるのでは?
   

クエリ一発なら下記のSQLで行けないかな?
SELECT T0.ID, T1.商品名, T1.金額, T2.商品名, T2.金額
FROM ([select ID from T1
union
select ID from T2]. AS T0
LEFT JOIN T1 ON T0.ID=T1.ID) LEFT JOIN T2 ON T0.ID=T2.ID;

Aテーブルを T1、BテーブルをT2、とし
[No] を [ID] とすると(No はAccessの予約語なので)
下記を新たなクエリのSQLビューに貼り付けてデータシートビューで見ると
両テーブルに含まれる番号だけの一覧がでてきます。
これを、Q1 とします
select ID from T1
union
select ID from T2;

でこのクエリを元にして。
もう1個新たなクエリを作ります。
先ほどのQ1とT1、T2 を入れて
Q1.ID ---→T1.ID
   \--→T2.ID のように結合線を引くとお望みの結果になるのでは?
   

クエリ一発なら下記...続きを読む

Q[Access2000]リレーションが設定されたレコードが必要

ACCESS2000

1対1でリレーションを設定しています。
T_マスター
T_内容

ID→ID 参照整合性ON 連鎖OFF 結合の種類「2」

新しいレコードをT_マスターに追加しようと
すると、
「リレーションが設定されたレコードが必要」
とエラーメッセージが出ます。

T_マスターにはレコードが追加されるようなんですが、T_内容にはレコードが追加されないようで
そのためエラーが発生するようです。

このエラーを解消するためにはどのような
リレーションの設定をすればよろしいでしょうか?

Aベストアンサー

>新しいレコードをT_マスターに追加しようとすると「リレーションが設定されたレコードが必要」とエラーメッセージが出ます。
1対1でリレーションでこのメッセージがでるのはテーブルにリレーションの結合する同じキーが無いレコードをリレーションテーブルに保存しようとした場合にでます。

「T_マスターに追加しようとすると・・」でるということはT_マスターはテーブル側ではなくリレーションテーブルになっている可能性があります。
しかし「T_マスターにはレコードが追加されるよう・・」というのは矛盾があります。「T_マスターに追加しようとすると」ではなくT_内容に保存しようとした際にでるのではないでしょうか?
T_マスターにキーがなければT_内容に入力できません。(T_マスターがテーブルでT_内容がリレーションテーブルの場合)

まず結合の種類を確認してください。
T_マスターがテーブルでT_内容がリレーションテーブル

Qファイルメーカーのリレーションと計算の件

始めまして、教えてください。A(注文)とB(請求)をリレーションしています。A(注文)は顧客コードと日付を入力しています。B(請求)に顧客コードと日付(1週間分)を入力すると請求に反映させるようにしたいです。A(注文)からポータル機能でB(請求)に顧客の注文された品物を任意(1週間分)表示するにはどのようにしたら良いでしょうか?今の計算式はある顧客のすべての請求(今までの注文レコード)がでてしまいます。顧客と日付のリレーションで行う計算式が”顧客&""&(DateToText(日付))は1レコードに1日分の請求しかでません。任意に1レコードに1週間分の請求書を作成する良い方法をご教授願います。

Aベストアンサー

私も確認しましたが、 DateToText関数はver.7には存在しないので
ver.6として回答します。
※回答する側がこんな確認をするのは不条理だと思います。

下記二つのフィールドをリレーションする

注文書側の計算フィールド(テキスト)
顧客コード & DateToText(注文日)

請求書側の計算フィールド(テキスト)

顧客コード & DateToText(請求日) & "¶" &
顧客コード & DateToText(請求日-1) & "¶" &
顧客コード & DateToText(請求日-2) & "¶" &
顧客コード & DateToText(請求日-3) & "¶" &
顧客コード & DateToText(請求日-4) & "¶" &
顧客コード & DateToText(請求日-5) & "¶" &
顧客コード & DateToText(請求日-6)

MacOS10.3.9,FM6で確認


人気Q&Aランキング

おすすめ情報