• ベストアンサー
  • 困ってます

多側のない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側に一斉に?楽に入力するには何かいい方法がないでしょうか。 説明不足でしたらすみません、補足いたします。 すみませんが、どなたかご教授お願いいたします。

共感・応援の気持ちを伝えよう!

  • 回答数4
  • 閲覧数355
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.2

一側のテーブル名:★★ 多側のテーブル名:▲▲ とした時に、表示上あるように見せる一例 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 という構成も???・・・・と、思っただけでした。

共感・感謝の気持ちを伝えよう!

質問者からの補足

お返事ありがとうございます。 お久しぶりです。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の空の部分(無記入の分類レコード)に入れておきたかったのです。 実際のデータでは空の部分があるとまずいので、そのためです。 すみませんありがとうございました。

関連するQ&A

  • 入力のないレコード欄を空欄(スペース)にできますか?

    MS Access 2000を使っています。 1対多のリレーションをしたテーブルで、1の方のIDを使って、多の方に関係するデータを入力しました。クエリで両方のテーブルの情報をまとめて表示したいのですが、多の方に入力した分と対応する1のIDが使われているのだけが表示されて、多の方でIDを使ってないけど、1の方でも表示に含みたいデータがあって、それは表示されません。それは1のIDが、多の方で使われていないと、多のテーブルではそのIDの欄無いことになってしまっているからだと感じました。なので、多のテーブルの中で1のIDのすべてを含むために、1のIDが不必要なところにも一応スペースをいれたいです。なにかそのような方法はありますか?

  • アクセスでフォームに入力したレコードの複製について教えてください

    アクセスでフォームに入力したレコードの複製したいのですが、何か方法はありますか? テーブルをコピペしようとしたらオートナンバーを含んだフィールドを入れているせいか、ペストができません。

  • ACCESS2000でオートナンバーを1から付けたいのですが

    ACCESS2000のテーブルで新規に作ったときはオートナンバーフィールドが1からになるんですが、何度かレコードの試験入力や削除を繰り返しているうちに、頭の番号が増えていきます。テーブルのデザインで、オートナンバーをテキスト型にして、新しいオートナンバー型行を挿入しても1からになりません。なにかよい方法はないでしょうか?

その他の回答 (3)

  • 回答No.4

#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 とします。 ※ 上記での「消す」はレコードを削除することではなく、   抽出結果上に残す(消さない)/残さない(消す)ことになります。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

返事が遅くなりまして、大変申し訳ありません。 私が思っていた通りにできましたので、ベストアンサーに選ばせていただきました! 詳しい説明をありがとうございます! 日本語にしないと理解ができないなんてお恥ずかしいかぎりです… 消すと残すの違いまで教えていただき、助かりました! まだまだ精進いたします。 ありがとうございました。

  • 回答No.3

#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値の場合に限ります。」 ということですね! 納得いたしました。 初歩的な質問にも関わらず、お答えいただきありがとうございました。 精進いたします。

  • 回答No.1

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になっています。数値(オートナンバー)だと分かりづらいので、どうしても大分類名で表示したいのですがどうしたらよいでしょか?

  • accessデータ活用法

    編集方法で悩んでおります。 受注テーブル ID オートNo. 品名 テキスト 数量 数値 品名テーブル ID オートNo. 品名 テキスト とあるとします。 テーブル同士は、リレーションはされておらず、 受注フォームのリストボックスのコントロールソースに品名テーブルが参照されています。 今回、品名を分類コードで仕訳したいのですが... せっかく品名が入力されているのでそれを引用したいです。 そこで、 (1)新たに分類テーブルを作成し組込む (2)品名テーブルの行を増やし、分類コードのフィールド追加 (3)品名を置換えや条件分岐関数で分類コードに変換 ちなみに、品名/分類は10種類以内です。 (1)(2)はいろいろ試しましたが、受注テーブルの既存データのクエリ結果が得られません。 そもそも、考えが間違ってるでしょうか??? 宜しくお願いします。

  • access2000で テーブルに+表示:リレーションしたとき

    アクセスで大きなデータテーブルをいくつかの子テーブルに分解し,各テーブルを共通のID(オートナンバのインデックスキー)により、1:1のリレーション付け(Aテーブル~Bテーブル~Cテーブル)を行ってから、 テーブルを開いてみました。ところがBやCテーブルを開くとそのテーブル内の一番左側に新しいフィールドのようなものができかつ,そのセルに+記号が表示されクリックするとリレーションついたAテーブルの対応するレコードの内容が表示されるのですが、これは処理として正常なのか、どこか私が間違ったことをしているのか,お教え願います。 この+記号について知りたいのですが、ヘルプに説明が入っているのでしょうか。

  • 複数の項目でレコードがユニークになる場合のチェック

    Access97で質問です。 一般に1つの項目でレコードがユニークになるテーブルは良く見かけますが、たとえば、色と階数と建坪の3つの項目で誰の家なのかがユニークに特定されるテーブルがあったとします。 フォームからデータ入力する場合、重複チェックするにはどうしたらよいのでしょうか? キーがひとつなら、テーブルのインデックスに「重複なし」としておけばいいのですが、複数キーでユニークになる場合にはどうしたよいのかわかりません。 さらに、サブフォームを作った場合には何をリレーションすればよいのでしょうか? オートナンバー型のIDを駆使すれば実現できるのでしょうか? よろしくお願いいたします。

  • Accessのテーブルのレコード追加について

    お世話になります。 テーブルのレコードをコピーして、別のテーブルに 「編集」の中の「追加貼り付け」でテーブルのレコードを 追加しました。 しかし、データ型をオートナンバーにしているフィールド があったのですが、追加したレコードの部分のナンバーが 連番になりません。 どの様にしたら、追加した分も連番になりますでしょうか。 お教え下さいます様、宜しくお願い致します。

  • Accessでの新規レコードの追加の方法

    Windows XP上でMicrosoft Access 2000を使用しています。 オートナンバー型フィールド1つのみを含むテーブルに新規レコードを追加したいのですが、クエリやそれを基にしたフォームを介した方法はもちろんのこと、テーブルをデータシートビューで表示した状態でも追加することができません。 例えばレコードセレクタからレコード追加を選んでレコード保存を選んでも追加されません。 このテーブルに別のフィールドを追加してデータを入れるとレコードの追加が可能なのですが、オートナンバー型フィールド1つのみではうまくいきません。 どなたかオートナンバー型フィールド1つのみを含むテーブルに新規レコードを追加する方法を御存知でしたら御教示下さいませ。

  • フォームに新規レコードを入力できない

    アクセス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に書きこむ方法があれば、教えてください。

  • テーブル作成クエリーでオートナンバー型のレコードを作成したい。

    教えてください。Access2000で困ってます。 テーブル作成クエリーから作成するテーブルAにオートナンバー型のレコードを追加したいのですが、どうしたらいいでしょうか? テーブルAに先にオートナンバー型のレコードを追加しておいても再度クエリーを実行するとなくなってしまいました。 できればクエリーでなんとかしたいのですが無理なんでしょうか? ご存じの方、お願いします! もう、頭がパンクしました!

  • Accessでのエラー

    Access修行中の身で、勉強をかねて書類BOXのデータベースを作成中です。 親テーブルのフィールド  ID(主キー、オートナンバー)、タイトル名、・・・・・、保存箱ID 子テーブルのフィールド  保存箱ID(主キー、オートナンバー)、保存箱名、・・・・ リレーション  親:保存箱ID-子:保存箱ID という構成です。 クエリで以下のような複合テーブルを作成し、 複合テーブルのフィールド  ID(主キー、オートナンバー)、タイトル名、・・・、保存箱名、・・・・ データを入力しようとすると、「レコードを追加できません。テーブルの結合キーがレコードセットにありません。」というエラーがでます。また、保存箱IDに入力のないレコードは、抽出されません。 どのようにしたいかというと、保存箱IDは入力しなくてもいいフィールド(関連させなくてもよいデータ)にしたく、複合テーブルで保存箱名を入れると、子テーブルに新たにレコードが追加されるようにしたいです。 できれば、SQLを使用せずに解決したいと甘えておりますが、無理でしょうか。

  • アクセス 数値型にするとフォームの入力ができない

    お世話になります。色々調べたり、実験してみたのですが、分からない点があります。 簡単でいいので、可能性のある原因を教えてください。 アクセス2003です。 ■パターン1  フォームC の入力ができる テーブルA(主キーがオートナンバー型)、その他4つのテーブル(これら5つのテーブルは、参照整合性リレーションで結ぶ) →それらを元にクエリBを作る→クエリBを元にフォームC を作る ■パターン2  フォームC の入力ができない テーブルA(主キーが数値型)、その他4つのテーブル(これら5つのテーブルは、参照整合性リレーションで結ぶ) →それらを元にクエリBを作る→クエリBを元にフォームC を作る 簡単にいうと、テーブルのデータ型によって、入力可否が変わるのです。 なぜ、パターン2は、入力できないのか分かりません。 よろしくお願いします。