- ベストアンサー
SQL文の結合(一対多)がわからない
色々とネットで調べてみたのですが、ピンとこないので質問させていただいています。 以下のようなテーブルを想定しています。 「テーブルA」 ユニークキー データ1 データ2 ・・・ 0001 ... 0002 ... 0003 ... 「テーブルB」 キー データA データB ・・・ 0001 ... 0001 ... 0002 ... テーブルAではユニークキーは重複していないのですが、テーブルBのキーは重複しています。 このような状況で、テーブルBの”キー”とテーブルAの”ユニークキー”を照合させて、テーブルBに”データ1 データ2 ・・・”を流し込みたいと思っています。 現状では、複数の検索結果が出るためにエラーとなっています。「一対多」結合を利用するというところまではわかったのですが、そこから先がよくわかりません。 どなたか解説していただけないでしょうか。 初心者の質問で恐縮ですが、お教え頂ければ嬉しいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
テーブル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;
その他の回答 (3)
- CHRONOS_0
- ベストアンサー率54% (457/838)
>一対多については、”「一対多」のリレーションシップを「結合」して、 >データを処理していく”との理解でよろしいでしょうか。 リレーションシップはテーブルの関係を規定するもの 結合は2つのレコードセット(テーブルまたはクエリ)をどう結びつけるかを規定するものです リレーションシップとは全く関係ありません >その理由は余計なメモリを使ってしまうからでしょうか。 これは理由の中でも重要度の低いものです 一番重要な理由はデータの整合性を保つという点ですね 詳しくは本やヘルプで正規化について調べてください これを理解しないといいデータベースは作れませんよ
お礼
CHRONOS_0さん、度々のご回答ありがとうございます。 わかりやすいく解説して頂いて、リレーションシップと結合の関係について理解できました。 いまはデータベースを使うのに精一杯ですが、次はデータベースの設計についても学んでいきたいと思います。 質問以外の文中の誤解までご指摘頂いて、ありがとうございます。自分で気づかないところを教えて頂けたので、大変勉強になりました。ありがとうございました。
- CHRONOS_0
- ベストアンサー率54% (457/838)
結合には内部結合と外部結合しかありません 1対多はリレーションシップです 全く異なるものであることを理解した方がいいですね >テーブルBに”データ1 データ2 ・・・”を流し込みたいと思っています。 こういうものはテーブルAとBを内部結合(Inner join)するSQLでできます それと、 テーブルAのようなテーブルがあり、テーブルBがそれを参照している関係なら テーブルBにはテーブルAの主キーだけを参照キーとして取り込みます 他のデータ1や2は取り込んではいけません
補足
CHRONOS_0さん、ご回答ありがとうございます。 一対多については、”「一対多」のリレーションシップを「結合」して、データを処理していく”との理解でよろしいでしょうか。 二点目の「データ1や2は取り込んではいけない」とのご指摘ですが、その理由は余計なメモリを使ってしまうからでしょうか。 よろしくお願いいたします。
- jamshid6
- ベストアンサー率88% (591/669)
やりたいことは「テーブルAの内容で、テーブルBを更新する」 つまり「テーブルBにもデータ1、データ2などのフィールドがあって、そこにキーが一致するテーブルAのデータ1、データ2の内容をセットしていきたい」ということであっていますか? もし上の理解があっているならば、この場合の更新処理はDBMSによって書き方が随分違いますので、何のデータベースを使っているのかわからないとコメントしづらいです。 あえて「その他(データベース)」に書かれているところから、Accessかなとは思ったのですが、もしかしたらMySQLやOracleかもしれないので。。。
補足
早速のご回答ありがとうございます。 「テーブルBにもデータ1、データ2などのフィールドがあって、そこにキーが一致するテーブルAのデータ1、データ2の内容をセットしていきたい」の通りで間違いありません。 テーブルBにあるキーの重複をどのように回避すればいいのか、が現在の障害です。 また、データベースはご指摘の通りAccessです。今回はアプリケーションの機能ではなく、SQL文で処理していかなければならない状況です。 お手数おかけしますが、よろしくお願いいたします。
お礼
jamshid6さん、ご回答ありがとうございました。 一方のデータが一意に定まっていれば、他方に重複があっても内部結合できるということですね。 結合の部分はややこしくて理解し難いので、徐々に慣れていきたいと思います。 大変助かりました。初歩的な質問にもご丁寧にご回答いただき、ありがとうございました!