Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Access 2016)
3つのテーブルに入力するためのフォーム
投稿日時: 17/12/13 17:48:49
投稿者: lucid

非常に項目数の多いアンケートのようなものをAccessに落とし込もうとしております。
下記のような3つのテーブルを作成しました。
 
テーブル1
 ID
 項目A
 項目B
 項目C
テーブル2
 ID
 項目D
 項目E
 項目F
テーブル3
 ID
 項目G
 項目H
 項目I
 
フォームを一つ用意してテーブル1〜3に一括で入力したいのですが、どのように実現したら良いでしょうか。
各テーブルのIDをリレーションで結べば良いのかとも思ったのですが参照整合性を満たしていないようでリレーションを結べません。
3つに分かれたテーブルに対して入力を行うフォームの作成方法を教えていただけないでしょうか?
 

回答
投稿日時: 17/12/13 18:25:07
投稿者: Suzu

こんにちは。
 
参照整合性 を持たせる場合、
主テーブル 1個
従テーブル 複数
を満たす必要があります。
 
多分、各テーブルの ID は 主キー となっているのではありませんか?
 
その場合
主テーブル 3個
になってしまいます。
 
ですので
 
テーブル1 を主テーブルとするなら ID を主キー (このテーブルのデザインを変える必要はありません)
 
テーブル2/3 共に

適当なフィールド名   主キー
ID                   長整数型
項目D/G              適切なデータ型
項目E/H              適切なデータ型
項目F/I              適切なデータ型

とする必要があります。
 

回答
投稿日時: 17/12/13 22:06:17
投稿者: hatena
投稿者のウェブサイトに移動

各テーブルの関係は、一対一の関係(=すべてのテーブルの主キーがID)ですか。
 
だとしたら、下記をご参考に。
 
一対一関係のテーブル設計 - hatena chips
http://hatenachips.blog34.fc2.com/blog-entry-29.html
 
※Suzuさんへ、一対一の関係でも参照整合性を持たせることは可能です(上記リンク先を参照ください)。
 
リンク先は2つのテーブルですが、3つのテーブルなら、
テーブル1 に残りの2つのテーブルを外部接続すればいいでしょう。
 
SELECT
 テーブル1.*,
 テーブル2.項目D, テーブル2.項目E, テーブル2.項目F
 テーブル3.項目G, テーブル3.項目H, テーブル3.項目I
FROM
 (テーブル1 LEFT JOIN テーブル2
 ON テーブル1.ID = テーブル2.ID)
 LEFT JOIN テーブル3
 ON テーブル1.ID = テーブル3.ID;
 
このクエリをフォームのレコードソースにすれば一つのテーブルのように入力できます。
リンク先にサンプルファイルもありますので、確認してみてください。
 
ただし、上記のリンク先でも解説してますが、一対一関係のデータは、一つのテーブルにまとめるというのがデータベース設計のセオリーです。分けようと思った利用は何でしょうか。
ひょっとして、フィールド数が制限の255を超えしまうからでしょうか。
だとしたら、クエリでも255の制限がありますので、上記のクエリではむりですね。
テーブル設計から見直したほうがいいでしょう。
 
各項目がアンケートの設問だとしたら、フィールドして横に展開するのではなく、下記のように縦に並ぶように設定するのがデータベースの設計原則(正規化)に沿っていると思います。
設問番号 設問名 設問内容
1    設問1  あなたの好きな動物は?
2    設問2  あなたの好きな果物は?
3    設問3  あなたの好きなスイーツは?
・    ・    ・・・・
・    ・    ・・・・

投稿日時: 17/12/14 10:23:43
投稿者: lucid

Suzuさん
 
おっしゃる通り各テーブルのIDは主キーとなっていました。
参照整合性について理解できていなかったのですが、わかりやすい解説をありがとうございました。
 
 
hatenaさん
 
フィールド数は合計で255以内に収まったようです。
3種類の書類がセットになったもので、一つ一つの分量が多かったため3つのテーブルに分けようとしました。
教えていただいたSQL文で無事目的は果たせそうです。
 
設問を縦に並べるという設計を提案いただきましたが、解答をどうやってまとめれば良いのかがよくわかりませんでした。
とりあえずフィールドとして横に展開するやり方で進めて、正規化は後々やり方を勉強してみようと思います。
詳細な解説をありがとうございました。