こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

すみませんが、どなたかご教授お願いいたします。

投稿日時 - 2012-01-24 16:43:05

QNo.7263971

困ってます

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

一側のテーブル名:★★
多側のテーブル名:▲▲

とした時に、表示上あるように見せる一例

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

という構成も???・・・・と、思っただけでした。

投稿日時 - 2012-01-25 15:55:48

補足

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

投稿日時 - 2012-01-26 16:23:29

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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 とします。

※ 上記での「消す」はレコードを削除することではなく、
  抽出結果上に残す(消さない)/残さない(消す)ことになります。

投稿日時 - 2012-01-28 10:24:05

お礼

返事が遅くなりまして、大変申し訳ありません。
私が思っていた通りにできましたので、ベストアンサーに選ばせていただきました!

詳しい説明をありがとうございます!
日本語にしないと理解ができないなんてお恥ずかしいかぎりです…
消すと残すの違いまで教えていただき、助かりました!

まだまだ精進いたします。
ありがとうございました。

投稿日時 - 2012-01-31 14:02:12

ANo.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 でも・・・・

投稿日時 - 2012-01-26 20:54:42

お礼

お返事ありがとうございます!

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値の場合に限ります。」

ということですね!
納得いたしました。
初歩的な質問にも関わらず、お答えいただきありがとうございました。
精進いたします。

投稿日時 - 2012-01-27 14:18:26

ANo.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ビューに貼り付けてください。
※データのバックアップはお忘れなく。

投稿日時 - 2012-01-25 00:15:39

補足

お返事ありがとうございます。

お返事いただいた通り行ってみましたが、エラーがでてしまいます…
ただ、1つ目の構文と2つ目の構文とでエラーに違いがありました。
1つ目の構文では

「追加クエリを実行するとテーブルのデータが変更されます。」→「はい」

→「10件のレコードを追加します。」→「はい」

→「追加クエリですべてのレコードを追加できません。
 型変換エラーのため、0個フィールドをNullに設定しました。また、10件のレコードで
 キー違反、0件のレコードでロック違反、0件のレコードで入力規則違反が発生したため、
 れこどーどを追加できませんでした。」

というエラーでした。
2つ目の構文では

「追加クエリを実行するとテーブルのデータが変更されます。」→「はい」
→「0件のレコードを追加します。」

というエラーです。
これが本当にエラーなのか、それともこれを応用して使えということなのか
私にはわかりかねました。すみません。

もしnicotinismさんの思っていた通りになっていないのであれば、
またご指摘いただけたらと思います。
よろしくお願いいたします。

投稿日時 - 2012-01-26 15:29:04

あなたにオススメの質問