1対多のテーブルで多側のない1側レコードに多を入力する方法
- 1対多のリレーションがされたテーブルで、多側のない1側レコードに多を入力する方法について教えてください。
- 具体的な例を挙げて説明します。1側テーブルには10の行コードがありますが、2, 4〜6, 8〜10の行コードに対応する多側レコードがありません。この未入力の多側に共通のレコードを入力する方法を知りたいです。
- おそらくクエリを使用して多側のない1側を抽出することはできると思いますが、一斉に入力する方法があれば教えてください。
- ベストアンサー
多側のない1側レコードに多を入力するには
こんにちは、いつもお世話になっています。 ウィンドウズ7 Access2010 質問なのですが、 1対多でリレーションされたテーブルレコードに、 1の中に多が一つもないレコードに対し、共通のレコードを追加することができますか? 以下例 1側テーブル 行コード(オートナンバー):1 行:あいうえお 行コード(オートナンバー):2 行:かきくけこ 行コード(オートナンバー):3 行:さしすせそ 中略 コード:10 行:わをん 多側テーブル 分類コード(オートナンバー):1 行コード:1 分類:母音 分類コード(オートナンバー):2 行コード:3 分類:子音 分類コード(オートナンバー):3 行コード:7 分類:子音 この場合、 1側テーブルの行コードが2、4~6、8~10の多側が入力されていません。 この未入力の多側テーブルに共通のレコードを入力したいのです。 ただし、共通と言っても、分類コードはオートナンバーで、 行コードは1側のテーブルに対応した数字を入力してほしいです。 おそらく、クエリで多側のない1側を抽出することはできると思います。 しかし、多側のない1側に一斉に?楽に入力するには何かいい方法がないでしょうか。 説明不足でしたらすみません、補足いたします。 すみませんが、どなたかご教授お願いいたします。
- nmt3942
- お礼率60% (32/53)
- オフィス系ソフト
- 回答数4
- ありがとう数2
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
一側のテーブル名:★★ 多側のテーブル名:▲▲ とした時に、表示上あるように見せる一例 SELECT Q1.行コード, Q1.行, IIf(Q2.分類 Is Null,"子音",Q2.分類) AS 分類 FROM ★★ AS Q1 LEFT JOIN ▲▲ AS Q2 ON Q1.行コード=Q2.行コード; の結果は 行コード 行 分類 1 あいうえお 母音 2 かきくけこ 子音 3 さしすせそ 子音 4 たちつてと 子音 5 なにぬねの 子音 6 はひふへほ 子音 7 まみむめも 子音 8 やゆよ 子音 9 らりるれろ 子音 10 わをん 子音 また、追加する形では INSERT INTO ▲▲ ( 行コード, 分類 ) SELECT Q1.行コード, "子音" FROM ★★ AS Q1 LEFT JOIN ▲▲ AS Q2 ON Q1.行コード=Q2.行コード WHERE Q2.行コード Is Null; とか UPDATE ★★ AS Q1 LEFT JOIN ▲▲ AS Q2 ON Q1.行コード=Q2.行コード SET Q2.行コード = Q1.行コード, Q2.分類 = "子音" WHERE Q2.行コード Is Null; の結果、多側テーブルの内容は 分類コード 行コード 分類 1 1 母音 2 3 子音 3 7 子音 4 2 子音 5 4 子音 6 5 子音 7 6 子音 8 8 子音 9 9 子音 10 10 子音 ※ 後者(UPDATE)は、主キー等の設定でエラーになる場合あり 提示された例では、一対多より一対一のように見えましたが 実際にはどのようなデータになっているのでしょうか。 分類コード 行コード 分類 1 1 母音 11 1 ???? もしかすると 行コード 行 101 がぎぐげご というものがあって 分類コード 行コード 分類 11 101 子音(?) 12 101 濁音(?) とかになるのでしょうか 「分類コード」等どう使っていくのか、わかっていないので 一対一なら・・・・以下独り言 一側テーブルに「分類」を追加して、テーブルを1つにしても??? 行コード 行 分類 1 あいうえお 母音 2 かきくけこ 子音 3 さしすせそ 子音 また、 分類コード 分類 1 母音 2 子音 行コード 行 分類コード 1 あいうえお 1 2 かきくけこ 2 3 さしすせそ 2 という構成も???・・・・と、思っただけでした。
その他の回答 (3)
- 30246kiku
- ベストアンサー率73% (370/504)
#3です チョッと微妙に・・・補足したかったので > ▲▲の行コードと分類のところに、Q1の行コードと“子音”という言葉を入れなさい。 > ★★をQ1、▲▲をQ2とします。 上記部分は、その通りで > Q1の行コードとQ2の行コードは同じです。 > ただしQ2の行コードがNull値の場合に限ります。 Q1 の行コードと Q2 の行コードが同じもので Q1 と Q2 を結び付けるけど、 Q1 の行コードに対応する Q2 の行コードがなかった場合、Q1 は消さないでちょうだい。 (FROM Q1 LEFT JOIN Q2 ON Q1.行コード=Q2.行コード)の LEFT JOIN がその指定 消さないで残ったところをみると、Q2.行コードは Null ですよねってことで、 WHERE Q2.行コード Is Null で対応するものがなかった Q1 を使いましょう。 対応する行コードのみを抽出する時には INNER JOIN とします。 ※ 上記での「消す」はレコードを削除することではなく、 抽出結果上に残す(消さない)/残さない(消す)ことになります。
お礼
返事が遅くなりまして、大変申し訳ありません。 私が思っていた通りにできましたので、ベストアンサーに選ばせていただきました! 詳しい説明をありがとうございます! 日本語にしないと理解ができないなんてお恥ずかしいかぎりです… 消すと残すの違いまで教えていただき、助かりました! まだまだ精進いたします。 ありがとうございました。
- 30246kiku
- ベストアンサー率73% (370/504)
#2です > この場合、Q2分類のパラメータの入力を求められ・・・ 多側のテーブルにフィールド「分類」が存在した時、入力は求められないと思います。 Q2.分類 が、ドットなしの Q2分類 になっていたりしませんでしょうか。 > Q1やQ2というのは何を示しているのですか? これは、一旦 Q1 とかに名前を置き換えましょうか・・・という程度です。 ★★ AS Q1 で、Q1 と書いたら ★★ のことですよ。 INSERT INTO ▲▲ ( 行コード, 分類 ) SELECT Q1.行コード, "子音" FROM ★★ AS Q1 LEFT JOIN ▲▲ AS Q2 ON Q1.行コード=Q2.行コード WHERE Q2.行コード Is Null; これを Q1 / Q2 を使わないで記述したとすると INSERT INTO ▲▲ ( 行コード, 分類 ) SELECT ★★.行コード, "子音" FROM ★★ LEFT JOIN ▲▲ ON ★★.行コード=▲▲.行コード WHERE ▲▲.行コード Is Null; のようになってしまいます。 これはこれで動作に違いはありませんが、書く側/読む側からするとイメージしにくい・・・ また、実際のテーブル名に書き換える箇所が多く存在することになります。 修正個所を少なく、イメージしやすいように短い文字列に置換えてってことを私はします。 ★★ / ▲▲ が、例えば、Tひらがな行 / Tひらがな分類 という名称だったとしたら INSERT INTO Tひらがな分類 ( 行コード, 分類 ) SELECT Tひらがな行.行コード, "子音" FROM Tひらがな行 LEFT JOIN Tひらがな分類 ON Tひらがな行.行コード= Tひらがな分類.行コード WHERE Tひらがな分類.行コード Is Null; 雰囲気です。 動作に違いはありません。 今回 Q1 / Q2 を使用しましたが、 T1 / T2 でも、TA / TB でも・・・・
お礼
お返事ありがとうございます! SELECTの項目を増やせば、実際のデータのほうでもきちんとできました!!! 私の説明不足にも関わらず、いつも本当にありがとうございます。 ASの使い方も理解しました。 >INSERT INTO ▲▲ ( 行コード, 分類 ) SELECT Q1.行コード, "子音" FROM ★★ AS Q1 LEFT JOIN ▲▲ AS Q2 ON Q1.行コード=Q2.行コード WHERE Q2.行コード Is Null; これを日本語に訳すと 「▲▲の行コードと分類のところに、Q1の行コードと“子音”という言葉を入れなさい。 ★★をQ1、▲▲をQ2とします。Q1の行コードとQ2の行コードは同じです。 ただしQ2の行コードがNull値の場合に限ります。」 ということですね! 納得いたしました。 初歩的な質問にも関わらず、お答えいただきありがとうございました。 精進いたします。
- nicotinism
- ベストアンサー率70% (1019/1452)
SELECT [1側テーブル].行コード FROM 1側テーブル WHERE [1側テーブル].行コード Not In (SELECT [1側テーブル].行コード FROM 1側テーブル INNER JOIN 多側テーブル ON [1側テーブル].行コード = 多側テーブル.行コード); とか SELECT [1側テーブル].行コード FROM 1側テーブル WHERE not exists(select * from 多側テーブル where [1側テーブル].行コード = 多側テーブル.行コード); で求む結果が得られたなら、この選択クエリを追加クエリに変更して保存後に実行してみてください 上記SQL文はタブ付きドキュメントならタブの処で右クリックして現れるSQLビューに貼り付けてください。 ※データのバックアップはお忘れなく。
補足
お返事ありがとうございます。 お返事いただいた通り行ってみましたが、エラーがでてしまいます… ただ、1つ目の構文と2つ目の構文とでエラーに違いがありました。 1つ目の構文では 「追加クエリを実行するとテーブルのデータが変更されます。」→「はい」 →「10件のレコードを追加します。」→「はい」 →「追加クエリですべてのレコードを追加できません。 型変換エラーのため、0個フィールドをNullに設定しました。また、10件のレコードで キー違反、0件のレコードでロック違反、0件のレコードで入力規則違反が発生したため、 れこどーどを追加できませんでした。」 というエラーでした。 2つ目の構文では 「追加クエリを実行するとテーブルのデータが変更されます。」→「はい」 →「0件のレコードを追加します。」 というエラーです。 これが本当にエラーなのか、それともこれを応用して使えということなのか 私にはわかりかねました。すみません。 もしnicotinismさんの思っていた通りになっていないのであれば、 またご指摘いただけたらと思います。 よろしくお願いいたします。
関連するQ&A
- アクセス クロス集計の列フィールド名変更
こんにちは。 質問です。 受注テーブル・・・受注ID(オートナンバー)/納期/台数/金額/大分類 大分類テーブル・・・大分類ID(オートナンバー)/大分類 大分類テーブルのIDと受注テーブルの大分類は一対多のリレーションになっています。 (本を見ながら作成したので、そもそもリレーションの必要性がはっきり把握していないのかもしれません) 納期を月単位でフォーマットして、クロス集計を作りました。 行・・・納期(月単位) 列・・・大分類 値・・・金額 行は1つしか選択できなかったので、行に納期、列に大分類としました。大分類は6種類あります。 集計の結果で列フィールドが大分類IDになっています。数値(オートナンバー)だと分かりづらいので、どうしても大分類名で表示したいのですがどうしたらよいでしょか?
- ベストアンサー
- その他MS Office製品
- accessデータ活用法
編集方法で悩んでおります。 受注テーブル ID オートNo. 品名 テキスト 数量 数値 品名テーブル ID オートNo. 品名 テキスト とあるとします。 テーブル同士は、リレーションはされておらず、 受注フォームのリストボックスのコントロールソースに品名テーブルが参照されています。 今回、品名を分類コードで仕訳したいのですが... せっかく品名が入力されているのでそれを引用したいです。 そこで、 (1)新たに分類テーブルを作成し組込む (2)品名テーブルの行を増やし、分類コードのフィールド追加 (3)品名を置換えや条件分岐関数で分類コードに変換 ちなみに、品名/分類は10種類以内です。 (1)(2)はいろいろ試しましたが、受注テーブルの既存データのクエリ結果が得られません。 そもそも、考えが間違ってるでしょうか??? 宜しくお願いします。
- ベストアンサー
- オフィス系ソフト
- Accessリレーションシップについて
お世話になります。 Access2010 普段はクエリにて、いくつかのテーブルやクエリを紐づけているのですが リレーションシップの設定は今までやったことがありません。 ネットで調べて、 ・「参照整合性」にチェックを入れることにより、1対多の多側で1側に存在 しないIDで登録しようとするとエラーになる。 →間違ったデータが入力されるのを防ぐ。 ・多側でリレーションシップが設定されているフィールドに値を入力しない ことは可能。但し、当該フィールドの「値要求」プロパティを"はい"に した場合は、入力しないとエラーになる。 ・「フィールドの連鎖更新」にチェックを入れると、1側で変更したものが 多側でも自動的に変更される。 ・「レコードの連鎖削除」にチェックを入れると、1側で削除した場合、 多側で該当するデータをもつレコードが自動的に削除される。 上記については実際に試してみて動きを確認しました。 ※上記の認識違いや、もっと大事なことがあればご指摘、ご教示頂けると 幸いです。 今までは、こっちのテーブルで削除したらこっちのテーブルでも削除 みたいなことをやってたので、便利だとは思うのですが。。 以下のテーブルでリレーションシップの設定を行ったとします。 売上テーブル ID 商品 担当者コード 1 AAAAA 3 2 BBBBB 1 3 AAAAA 1 4 CCCCC 2 5 CCCCC 3 担当者テーブル 担当者コード 担当者名 1 担当者A 2 担当者B 3 担当者C 売上テーブルの担当者コードと、担当者テーブルの 担当者コードでリレーションの設定を行い、「参照整合性」及び 「レコードの連鎖削除」にチェックを入れたとします。 例えばフォーム上にリストボックスを設置し ID 商品 担当者名 を表示し、リストボックス上で選択されたレコードを、削除ボタンを 押したら、そのレコードが削除されるプログラムを作成します。 ※選択されたレコードのIDを取得し削除クエリで削除。 リストボックスでID:5のレコードを選択し、削除ボタンを押した場合 売上テーブルのID:5のレコードを削除しても、担当者テーブルから 担当者コード:3のレコードは削除されない・・という認識でよろしい でしょうか。 ※要するに、1対多の多側で削除されても1側には影響無し。 同様にリストボックスでID:5のレコードを選択し、削除ボタンを押したときに 担当者コード:3を取得し、まずは担当者テーブルで担当者コード:3の レコードを削除すると、併せて売上テーブルのID:1及びID:5が削除 される。 要するに、上記のケースで「レコードの連鎖削除」の設定を行うと 本来削除すべきID:5以外のレコード(ID:1)まで削除されてしまう ことになる?? ※そもそも例がちょっと悪かったかもしれません。。 何が言いたいかというと、「フィールドの連鎖更新」「レコードの 連鎖削除」は、よーく考えて設定しないと意図しないところまで 更新されたり削除されてしまうのかなと。。なので、設定することに よって、プログラムの作りも変わってきてしまうことになるので しょうか。 理解不足で質問自体もモヤモヤしたものになってしまいましたが、 ご教示のほど、宜しくお願い致します。
- 締切済み
- オフィス系ソフト
- アクセスでフォームに入力したレコードの複製について教えてください
アクセスでフォームに入力したレコードの複製したいのですが、何か方法はありますか? テーブルをコピペしようとしたらオートナンバーを含んだフィールドを入れているせいか、ペストができません。
- ベストアンサー
- オフィス系ソフト
- リレーションシップで一対多となる条件
今Access2000を使っているのですが、 リレーションを組む際に、一対一と一対多になる違いを教えてください。 リレーションを組みたいのは、 主テーブルの主キー[登録CD]テキスト型 リレーションテーブル [登録CD]テキスト型 このテーブルの主キーはオートナンバーで[NO]としています いつも通りに作ってハズなのですが、 リレーションを組むと自動的に一対一になってしまいます。 リレーションテーブルになるためにフィールド数の制限などがあるのでしょうか? 宜しくお願いします。
- ベストアンサー
- オフィス系ソフト
- フォームに新規レコードを入力できない
アクセス2000 ウィンドウズ98 1.テーブル T_Master ID(主キー)、名前、住所 2.テーブル T_Detales ID(主キー)、基本ID、日付、金額 リレーション→T_MasterのID(主キー)=T_Detalesの基本ID(1対多) 結合プロパティ→2 フォーム(データシートビュウ) 名前 住所 日付 金額 山本 港区 3/19 3000 山本 港区 3/20 2000 山本 港区 3/22 4000 田中 新宿 2/17 1000 田中 新宿 1/17 1200 田中 新宿 3/22 1500 石井 横浜 3/22 4000 という具合に表示されています。 さらにフォーム開くときにフィルターによって、 名前 住所 日付 金額 山本 港区 3/19 3000 田中 新宿 3/22 1500 石井 横浜 3/22 4000 という具合に3月中のデータのみ表示されるようにしています。 最後の行(石井)のあとに新しい顧客が発生したら、追加できるように作成するにはどうしたら作成できますか? 現在のところ、「石井」の後ろに新規顧客を入れようとすると、当然ながら "レコードが追加できません。テーブル'~'の結合キーがレコードセットにありません。" と表示されます。 IDフィールド(オートナンバー)を作っても見ましたが、同じエラーがでて、新規登録できませんでした。 T_Masterに顧客を新規に登録すると同時に、明細をT_detailesに書きこむ方法があれば、教えてください。
- ベストアンサー
- オフィス系ソフト
- 複数の項目でレコードがユニークになる場合のチェック
Access97で質問です。 一般に1つの項目でレコードがユニークになるテーブルは良く見かけますが、たとえば、色と階数と建坪の3つの項目で誰の家なのかがユニークに特定されるテーブルがあったとします。 フォームからデータ入力する場合、重複チェックするにはどうしたらよいのでしょうか? キーがひとつなら、テーブルのインデックスに「重複なし」としておけばいいのですが、複数キーでユニークになる場合にはどうしたよいのかわかりません。 さらに、サブフォームを作った場合には何をリレーションすればよいのでしょうか? オートナンバー型のIDを駆使すれば実現できるのでしょうか? よろしくお願いいたします。
- ベストアンサー
- その他(データベース)
- 入力のないレコード欄を空欄(スペース)にできますか?
MS Access 2000を使っています。 1対多のリレーションをしたテーブルで、1の方のIDを使って、多の方に関係するデータを入力しました。クエリで両方のテーブルの情報をまとめて表示したいのですが、多の方に入力した分と対応する1のIDが使われているのだけが表示されて、多の方でIDを使ってないけど、1の方でも表示に含みたいデータがあって、それは表示されません。それは1のIDが、多の方で使われていないと、多のテーブルではそのIDの欄無いことになってしまっているからだと感じました。なので、多のテーブルの中で1のIDのすべてを含むために、1のIDが不必要なところにも一応スペースをいれたいです。なにかそのような方法はありますか?
- ベストアンサー
- オフィス系ソフト
- ACCESS2000でオートナンバーを1から付けたいのですが
ACCESS2000のテーブルで新規に作ったときはオートナンバーフィールドが1からになるんですが、何度かレコードの試験入力や削除を繰り返しているうちに、頭の番号が増えていきます。テーブルのデザインで、オートナンバーをテキスト型にして、新しいオートナンバー型行を挿入しても1からになりません。なにかよい方法はないでしょうか?
- ベストアンサー
- オフィス系ソフト
- Accessでの新規レコードの追加の方法
Windows XP上でMicrosoft Access 2000を使用しています。 オートナンバー型フィールド1つのみを含むテーブルに新規レコードを追加したいのですが、クエリやそれを基にしたフォームを介した方法はもちろんのこと、テーブルをデータシートビューで表示した状態でも追加することができません。 例えばレコードセレクタからレコード追加を選んでレコード保存を選んでも追加されません。 このテーブルに別のフィールドを追加してデータを入れるとレコードの追加が可能なのですが、オートナンバー型フィールド1つのみではうまくいきません。 どなたかオートナンバー型フィールド1つのみを含むテーブルに新規レコードを追加する方法を御存知でしたら御教示下さいませ。
- ベストアンサー
- その他MS Office製品
補足
お返事ありがとうございます。 お久しぶりです。kikuさんいつもありがとうございます。 ご指摘の通り、この例だと1対1ですね… 気づきませんでした。 1対多にするため、私も濁音を追加しました。 実際にやっているものは複雑なので簡易にしたものをと思い 例を作ってみたのですが、浅はかでした。 悩ませてしまったようで本当にすみません… ご指摘ありがとうございます。 >SELECT Q1.行コード, Q1.行, IIf(Q2.分類 Is Null,"子音",Q2.分類) AS 分類 FROM ★★ AS Q1 LEFT JOIN ▲▲ AS Q2 ON Q1.行コード=Q2.行コード; この場合、Q2分類のパラメータの入力を求められなにも入力しないとすべて「子音」と表示され、 「母音」と入力するとすべて「母音」と表示されてしまいます。 >INSERT INTO ▲▲ ( 行コード, 分類 ) SELECT Q1.行コード, "子音" FROM ★★ AS Q1 LEFT JOIN ▲▲ AS Q2 ON Q1.行コード=Q2.行コード WHERE Q2.行コード Is Null; この追加クエリで、テーブルに追加することができました! これだと、最初にあ行だけ「母音」という分類を入れておけば すべての行に「子音」の分類がはいります。 お伺いしたいのですが、Q1やQ2というのは何を示しているのですか? 「母音」でも「子音」でも「濁音」でもなんでも良いので、 T01とリレーションされたT02の空の部分(無記入の分類レコード)に入れておきたかったのです。 実際のデータでは空の部分があるとまずいので、そのためです。 すみませんありがとうございました。