- ベストアンサー
Accessリレーションシップの作成方法と1:1関係の制約について
- Accessにて、テーブルAとテーブルBの1:1のリレーションシップを作成したい場合、クエリを使用することができます。
- 具体的には、個人コードを入力すると、関連する名前と数量を参照することができます。
- しかし、1:1のリレーションシップでは個人コードの入力時に参照を行うことはできません。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
またまた#2です。 UPDATE テーブルA INNER JOIN テーブルB ON テーブルA.個人コード = テーブルB.個人コード SET テーブルA.数量 = [テーブルB].[数量]; この更新クエリーでEXCELからインポートしたデータに基づきテーブルAの数量を更新する事が 出来ると思いますよ。 ちなみにEXCELからインポートしたデータテーブルはテーブルBとしています。
その他の回答 (5)
- tak2003
- ベストアンサー率32% (174/540)
個人コードを入力するフォームがあると思うのですが、そのフォームのテキストボックスなどの値をクエリーの抽出条件にすればいいとおもいます。 1.デザインモードで個人コードの抽出条件のところで右クリックして 「ビルド」を選びます。 2.フォームのテキストボックスの値を選択します。 3.保存ボタンを押して閉じてください。 再びクエリを開いたら「[Forms]![フォーム1]![テキスト0]」などが追加されていると思います。 これは、フォーム1にあるテキスト0の値を抽出条件にするということです。 忘れずにテキスト0の書式でデータの型をテーブルの型とあわせておいてくださいね。
お礼
お返事遅くなりすみません。 何度もご回答いただきありがとうございました。
- xmoto
- ベストアンサー率27% (27/98)
#2です。 つまりはEXCELで作成したデータをインポートしてテーブルAに反映したいという事でしょうか? それであればテーブルAにやはり数量フィールドを追加してEXCELのデータをインポート後に 更新クエリーで一気に更新してしまえば入力の手間がなくなるのではないですか? 根本的な考え方がずれていたらすみません。
補足
何度もありがとうございます。 テーブルAに追加することも考えたのですが、 テーブルA ●個人コード ●氏名 ・ ・ のように複数のフィールドがあります。 Excelでは、 ●個人コード ●数量 の2つのフィールドのみです。 テーブルAには、約7000件。 Excelのデータは、テーブルAの件数すべての数量があるというわけではなく、 1000件弱程度です。 そのため、Excelのデータを別のテーブルにインポートし、 1:1のリレーションにしようと思いました。 更新クエリではできないかと思ったのですが、いかがでしょうか?
- tak2003
- ベストアンサー率32% (174/540)
テーブルAとテーブルBの個人コードが一意で等価ということですね。 テーブルA(個人情報) ●個人コード [00001] ●名前 [yastak] ●住所 [Japan] ・ ・ テーブルB(個人ごとの数量管理) ●個人コード [00001] ●数量 [100] select B!個人コード,A!名前,B!数量 from テーブルA as A inner join テーブルB as B on A!個人コード!=B!個人コード where B!個人コード="00001"; ・selectの後のB!個人コード,A!名前,B!数量は 抽出フィールド名です ・inner joinの後は等価結合するテーブル名、ONの後は 結合するフィールドを書いています ・where の後は抽出条件を書いています。入力した値を抽出条件にすれば任意のデータを取り出すことが出来ます。 データがある場合は、 where句に"00001"を設定すれば 00001,yastak,100の答えが帰ってきますよ。
補足
何度もありがとうございます。 テーブルAは、数千件のデータがあり、テーブルBは、千件程度のデータがあります。 クエリにて、個人データの入力をするのも、1件ではないので、 固定の個人コードを設定することはできません。 入力した個人コードに対して、その都度テーブルAより 名前を表示させるようにしたいのですが。
- xmoto
- ベストアンサー率27% (27/98)
まず、一対一なら何故テーブルAのフィールドに取り込まないのか?の疑問はあるものの・・・。 テーブルBの個人コードにコードを入力した時に、該当するコードがテーブルAにある場合 テーブルAに登録されている名前を参照したいという事でよろしいですよね? 入力後すぐに参照値を反映したいというのであれば、再クエリーが必要です。 手動で行う場合は、シフト+F9です。 クエリーから直接入力をするのであれば、手動のこの方法で再クエリーを実行するしかありません。 しかし、このクエリーをレコードソースとしたフォームから入力するのであれば、 個人コードの更新後処理でDoCmd.Requeryを実行すれば個人コードから移動する瞬間に 自動的に再クエリーされて名前を表示する事が出来ます。 でも、一般的にこういった一対一は使わないですよ?
お礼
ありがとうございました。 フォームにて使いたいと思います。 通常は、このようなテーブルAの中にすべて入れるべきなのでしょうが、 あるシステムで、テーブルA(個人のデータが入っているマスタ)があり この、個人コードを利用して、Excelにて個人ごとのデータを入力したリストがあります。 テーブルAに、フィールドを追加し、手入力するには件数が多いので この様にしてしまいましたが、 テーブルの作り方で、他に良い方法がありましたら、お願いいたします。
- tak2003
- ベストアンサー率32% (174/540)
クエリーの作り方で抽出がおかしくなっていませんか? SQLのモードに変更して(画面の一番左上です) select B!個人コード,A!名前,B!数量 from テーブルA as A inner join テーブルB as B on A!個人コード!=B!個人コード where B!個人コード="XXXXXXXXX"; テーブルBの個人コードをWhere句に入力するように組んでやれば動くと思うのですが?(動かなかったらヘルプでデバッグしてね^^;) それから個人コードと名前が1:1になるようにしたいなら、データの重複には十分注意してください。プライマリーキー設定をして一意にしておかなければ一つの個人コードで複数の名前がヒットしたりしますよ。 (Nullももちろんだめです。)
補足
早速、ありがとうございます。 個人コードと名前が1:1という部分がよく分からないのですが・・・。 テーブルAとテーブルBの個人コードが1:1になるようにしていて、 クエリを作成したときに、個人コードを入力(テーブルB)すると、 テーブルAより名前を参照させるようにしたいのですが、 質問の仕方が悪かったでしょうか・・・。 Where句で書いていただいている"xxxxxx"の部分もなにを書いたらいいのかよくわからないので 補足をよろしくお願いします。
お礼
お返事おそくなりすみません。 何度もご回答ありがとうございました。