• 締切済み

Access2000 リレーションについて

現在初歩の初歩からAccessの勉強中です。 リレーションが何の為にあるのか、設定するのかはよく分かるのですが、内部結合・外部結合や1対多・1対1などがよく分かりません。 ここで全てを教えていただくわけには行かないと思いますが、本などをいくつか読んでもいまいちピンときません。 具体的にどういうケースでどのように設定するのかも分かりません。 どなたかご教授頂けませんでしょうか? 分かりやすい書籍・ホームページのご紹介でも結構です。 よろしくお願い致します。

  • TEZZU
  • お礼率16% (1/6)

みんなの回答

  • yanmaa
  • ベストアンサー率45% (207/457)
回答No.2

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

  • msystem
  • ベストアンサー率42% (79/186)
回答No.1

まずはじめに、内部結合、外部結合は、実際にデータを取得する際に複数のテーブルからデータを持ってくるときに、どのようにデータを持ってくるかによって使い分けます。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とが違う場合、その変換のために使います)

関連するQ&A

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

    家にあるAccessの本やヘルプを見たのですが、いまいちよくわからないので 教えてください。 リレーションシップの結合の種類なのですが、 内部結合、左外部結合、右外部結合の3つがよくわかりません。 どういった時に、設定しなければいけないのかがわかりません。  どうか、具体例など挙げて教えていただければうれしいです。

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

    ACCESS2000 1対1でリレーションを設定しています。 T_マスター T_内容 ID→ID 参照整合性ON 連鎖OFF 結合の種類「2」 新しいレコードをT_マスターに追加しようと すると、 「リレーションが設定されたレコードが必要」 とエラーメッセージが出ます。 T_マスターにはレコードが追加されるようなんですが、T_内容にはレコードが追加されないようで そのためエラーが発生するようです。 このエラーを解消するためにはどのような リレーションの設定をすればよろしいでしょうか?

  • Accessでリンクしたテーブルのリレーションが設定できない

    PostgresへA5SQLとか言うツールを使ってテーブルを2つCreateTableしました。 テストデータも入力しました。 あらためてAccessでPostgresのテーブルをリンクテーブルとして参照しデータを見ることが出来ましたが、Access上でリレーションが未定義でサブフォームを作成することが出来ません。 リレーションを1:多で作成しようと思うのですが、設定フィールドが真っ白でいじれません。 何故でしょうか? 基本的にCreateTableするときに、なにやらリレーション設定する構文が必要だったのでしょうか? 今は、CreateTableしか構文は記述されていません。 どなたかご教授ください。 よろしくお願いします。

  • 学生 科目 課題のリレーション

    テーブルの設計をしています。 現在はACCESS2003で設計しており、ゆくゆくはSQLSERVER2005にしたいと考えています。 今現在あるテーブルは学生・科目履修・科目です。 順に1対多、多対1でリレーションを作成しています。 これに課題テーブルを作成したいのですが、どのようにリレーションすればいいか、分りません。以下課題の条件です。 ・課題には課題コードがあります。 ・1科目には必ず複数個の課題があります。 ・科目により課題の個数は違います。 ・学生1人1人に課題の点数を入力する必要があります。 私なりに1週間ほど考えたのですが、結局は科目履修とは別に、学生・実習・課題のようにテーブルを定義して1対多、多対1のリレーションしかないのでしょうか? しかしあまりにひどいリレーションになってしまいます。入力も時間がかかります。もっときれいに理論的に整理されたリレーションが作れないでしょうか? お手数でしょうが、ご教授ください。

  • アクセスでリレーションテーブルがあるかを調べるVBA

    例えば、作家名のテーブルと本のテーブルがあって、リレーションで結合されています。作家名.ID→本.ID VBAで、全ての作家名のIDで、本.IDを検索したいです。 もし、該当するIDがなければ、デフォルトで本.IDと本.名前を追加更新したいです。作家名のテーブルのデータはあるとして、本は一部のデータしかないというケースです。 If rs.RecordCount = 0 Then rs.AddNew rs!ID = 作家名.ID rs!名前 = "あくせすの本" rs.Update End If rsをどう定義するか? 一括更新するために、Do Until rs.EOF をどういう風に使うか? それとも、別のいい方法があればよろしくお願いします。

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

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

  • AccessからOracleへの外部結合

    AccessのテーブルからOracleのテーブルに外部結合した場合、遅くなるのはなぜでしょうか。対策はありますか。 AccessのテーブルからOracleのテーブルとほぼ同じ内容のサーバー上のAccessのテーブルに外部結合しても遅くない(数秒)ですがOracleのテーブルに外部結合すると30秒以上かかります。Accessの結合元のテーブル約3万件、Orcaleのテーブル約25万件です。 Oracleのテーブルに内部結合した場合は数秒です。 Access2000/Oracle8.0.5です。

  • 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

  • accessの勉強

    ネット上でアクセスを本格的に勉強したいのですが、良いホームページは見当たりません。テーブル、クエリー等の基本的動作は知っています。一つレベルアップして、リレーション等の機能について具体的に学びたいのです。どこか良いサイト知っている方教えて下さい。

  • Access2000 更新のタイミング?

    Access2000を使用しています。 1対1のリレーションシップを設定したテーブル「A」とテーブル「B」を作りました。 テーブル「A」にキーを入れると、テーブル「B」からそのキーに対応したデータが表示されるクエリを作りたいと思います。 そのキーに1対1のリレーションを設定しなければ、キーを入力した瞬間に対応したデータが表示されるのですが、1対1、又は、インデックス(重複なし)を設定すると表示されません。 しかし、テーブル「A」にはデータが重複しないようにしたいと思っています。 わかりにくい説明で申し訳ありませんが、お分かりになるかたがいらっしゃいましたら、どうすればこれを回避できるか教えてください。よろしくお願いいたします。