<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
 MS-Access2002チョ〜入門部屋>クエリを極める
  



 menu

43. 二つのテーブルの結合(一対多)

[おやつ配布テーブル]を使って、みんなのおやつの状況を調べようと思います。
が、[おやつ配布テーブル]には、入力を簡略化するために[番号]のフィールドしか入力していません。
名前やグループも一緒に出るように、[社員テーブル]とくっつけてひとつの表にしようと思います。

クエリを作り始めるときに、必要となるテーブルをすべて「追加」します。
[社員テーブル]側にきちんと主キーが設定されていれば、[おやつ配布テーブル]側に関連するフィールドがないかどうか自動的に探してくれます。で、同じ名前のフィールドがあれば、自動的に「結合線」が表示されます。

[社員テーブル]は[番号]が主キーになっています。
つまり、データの内容を見なくても、[番号]は重複しない、[番号]1件につき、ひとつのレコードが入力されるタイプのテーブルであることがわかります。
一方、[おやつ配布テーブル]は、誰がいつ何を食べたかを記録していますので、

この二つのテーブルの関係(リレーション)は、[社員テーブル]1件に対し、[おやつ配布テーブル]は配布した回数分のレコードが入っています。つまりこれが、「一対多の結びつき」ということになります。
複数のテーブルを結びつける際の、もっとも一般的な構造です。

テーブルがこのように設計されており(両方のテーブルに妥当な主キーが設定されていて)、フィールド名がそろっていれば、テーブル同士の結びつきは自動的に正しく行われます。
しかし、主キーの設定が正しくないがために両方のテーブルの関係があいまいな場合(特に、[社員テーブル]の主キーにオートナンバー型の適当なフィールドとかつけちゃってて[おやつ配布テーブル]との関係がMS-Accessに理解できない場合)、この二つのテーブルの関係は成立せず、このクエリは「更新できないクエリ(新規にレコードの追加とか、数量などの変更)」になってしまいます。

皆さんがわかっててもしょうがないことで、MS-Accessが、二つのテーブルの関係を判断できなければならないのです。
主キーとはそのために設定する必要があります。
テーブルを作っちゃってから、クエリで

後は、必要なフィールドを選べば完了。
操作はテーブルひとつだけのときと同じです。

フィールド選びのポイントとしては、できるだけ[おやつ配布テーブル]のほうからフィールドを選び、[おやつ配布テーブル]にないフィールドを、[社員テーブル]から補うようにすればいいでしょう。

「一対一」の結びつき、というのも、考え方は「一対多」と同じです。
ただ、二つのテーブルが両方とも「主キーが一個ずつ」なんですね。
あまり「一対一」という結びつきはやらないかもしれませんが・・・たとえば、社員に関する情報が多すぎてフィールド数が700とか800とかになっちゃうのて、社員の情報を、いくつかのテーブルに分けて作ってる、なんて場合は、時と場合によってはあちこちの[社員テーブルα]からフィールドをかき集めてひとつの表にまとめたい・・・なんてこともありえるかもしれません。そういうときは、どっちのテーブルも[社員の番号]が主キーになってるはずなので、「一対一」ってことになります。