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

解決済みの質問

SQL文の結合(一対多)がわからない

色々とネットで調べてみたのですが、ピンとこないので質問させていただいています。
以下のようなテーブルを想定しています。

「テーブルA」
ユニークキー データ1 データ2 ・・・
0001 ...
0002 ...
0003 ...

「テーブルB」
キー データA データB ・・・
0001 ...
0001 ...
0002 ...

テーブルAではユニークキーは重複していないのですが、テーブルBのキーは重複しています。
このような状況で、テーブルBの”キー”とテーブルAの”ユニークキー”を照合させて、テーブルBに”データ1 データ2 ・・・”を流し込みたいと思っています。
現状では、複数の検索結果が出るためにエラーとなっています。「一対多」結合を利用するというところまではわかったのですが、そこから先がよくわかりません。
どなたか解説していただけないでしょうか。

初心者の質問で恐縮ですが、お教え頂ければ嬉しいです。

投稿日時 - 2008-08-05 23:38:24

QNo.4230883

すぐに回答ほしいです

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

テーブルAはユニークキーですので、テーブルBのキーが重複していたとしても、それぞれのデータに対応するテーブルAのデータは一意に決まります。こういうケースは1対多であっても、問題なく内部結合による更新を掛けることができます。
Accessの場合の書式は以下の通りです。
(aとかbとかは別名で、毎回「テーブルA」「テーブルB」と書くのを省略するために使うものです)

UPDATE テーブルB AS b INNER JOIN テーブルA AS a ON a.キー=b.キー SET b.データ1 = a.データ1, b.データ2 = a.データ2;

投稿日時 - 2008-08-06 10:09:19

お礼

jamshid6さん、ご回答ありがとうございました。
一方のデータが一意に定まっていれば、他方に重複があっても内部結合できるということですね。
結合の部分はややこしくて理解し難いので、徐々に慣れていきたいと思います。
大変助かりました。初歩的な質問にもご丁寧にご回答いただき、ありがとうございました!

投稿日時 - 2008-08-07 02:25:18

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

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

回答(4)

ANo.4

>一対多については、”「一対多」のリレーションシップを「結合」して、
>データを処理していく”との理解でよろしいでしょうか。
リレーションシップはテーブルの関係を規定するもの
結合は2つのレコードセット(テーブルまたはクエリ)をどう結びつけるかを規定するものです
リレーションシップとは全く関係ありません

>その理由は余計なメモリを使ってしまうからでしょうか。
これは理由の中でも重要度の低いものです
一番重要な理由はデータの整合性を保つという点ですね
詳しくは本やヘルプで正規化について調べてください
これを理解しないといいデータベースは作れませんよ

投稿日時 - 2008-08-07 10:02:03

お礼

CHRONOS_0さん、度々のご回答ありがとうございます。
わかりやすいく解説して頂いて、リレーションシップと結合の関係について理解できました。
いまはデータベースを使うのに精一杯ですが、次はデータベースの設計についても学んでいきたいと思います。
質問以外の文中の誤解までご指摘頂いて、ありがとうございます。自分で気づかないところを教えて頂けたので、大変勉強になりました。ありがとうございました。

投稿日時 - 2008-08-07 14:34:40

ANo.3

結合には内部結合と外部結合しかありません
1対多はリレーションシップです
全く異なるものであることを理解した方がいいですね

>テーブルBに”データ1 データ2 ・・・”を流し込みたいと思っています。
こういうものはテーブルAとBを内部結合(Inner join)するSQLでできます

それと、
テーブルAのようなテーブルがあり、テーブルBがそれを参照している関係なら
テーブルBにはテーブルAの主キーだけを参照キーとして取り込みます
他のデータ1や2は取り込んではいけません

投稿日時 - 2008-08-06 11:19:59

補足

CHRONOS_0さん、ご回答ありがとうございます。
一対多については、”「一対多」のリレーションシップを「結合」して、データを処理していく”との理解でよろしいでしょうか。
二点目の「データ1や2は取り込んではいけない」とのご指摘ですが、その理由は余計なメモリを使ってしまうからでしょうか。
よろしくお願いいたします。

投稿日時 - 2008-08-07 02:47:57

ANo.1

やりたいことは「テーブルAの内容で、テーブルBを更新する」
つまり「テーブルBにもデータ1、データ2などのフィールドがあって、そこにキーが一致するテーブルAのデータ1、データ2の内容をセットしていきたい」ということであっていますか?

もし上の理解があっているならば、この場合の更新処理はDBMSによって書き方が随分違いますので、何のデータベースを使っているのかわからないとコメントしづらいです。

あえて「その他(データベース)」に書かれているところから、Accessかなとは思ったのですが、もしかしたらMySQLやOracleかもしれないので。。。

投稿日時 - 2008-08-06 02:41:57

補足

早速のご回答ありがとうございます。
「テーブルBにもデータ1、データ2などのフィールドがあって、そこにキーが一致するテーブルAのデータ1、データ2の内容をセットしていきたい」の通りで間違いありません。
テーブルBにあるキーの重複をどのように回避すればいいのか、が現在の障害です。
また、データベースはご指摘の通りAccessです。今回はアプリケーションの機能ではなく、SQL文で処理していかなければならない状況です。
お手数おかけしますが、よろしくお願いいたします。

投稿日時 - 2008-08-06 02:58:32

あなたにオススメの質問