内部結合について

このQ&Aのポイント
  • 内部結合を使用して複数のテーブルを結合し、一方のテーブルの全ての内容を表示しながら他のテーブルの内容を追加する方法について教えてください。
  • 口座情報に対して銀行情報や顧客情報がない場合も考慮し、出力イメージを提示してください。
  • SEOを意識した表現を使用して、内部結合に関する質問の要点を要約してください。
回答を見る
  • ベストアンサー

内部結合に関して

初歩的な質問で申し訳ありません。 以下のような3つのテーブルを結合する際に、ある1つのテーブルの内容を全て 表示したまま、その他のテーブルの内容を付加するような出力をしたいと考えています。 考え方としては、内部結合という事で、INNER JOIN を使うというような事は想像できますが、 3つのテーブルではそのような事が可能でしょうか? 最終的には出力想定イメージのような形としたいと考えています。 [口座] 銀行No 顧客No 残高 ------------------- B001 C001 30000 B001 C003 10000 B002 C001 40000 B002 C002 10000 B002 C004 50000 B003 C004 60000 [銀行] 銀行No 銀行名 --------------- B001 foo銀行 B002 bar銀行 [顧客] 顧客No 顧客名 -------------- C001 阿部 C002 村上 C003 渡辺 C004 越智 【出力想定イメージ】 銀行No 銀行名 顧客No 顧客名 残高 ------------------- B001 foo銀行 C001 安部 30000 B001 foo銀行 C003 渡辺 10000 B002 bar銀行 C001 安部 40000 B002 bar銀行 C002 村上 10000 B002 bar銀行 C004 越智 50000 B003 C004 越智 60000 ※ 口座情報に対し、銀行情報や顧客情報がないケースも存在します。 教えて下さい。 よろしくお願いします。

  • Oracle
  • 回答数2
  • ありがとう数6

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

  • ベストアンサー
  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.2

顧客情報が重複しているというなら、SQLを副問い合わせと外部結合の組み合わせにすれば何とかなります。 select A.銀行No, B.銀行名, A.顧客No, C.顧客名, A.残高 from 口座 as A left outer join 銀行 as B on B.銀行No = A.銀行No left outer join (select distinct 顧客No, 顧客名 from 顧客) as C on C.顧客No = A.顧客No しかしそもそもテーブルの正規化が出来ていないという、関係データベースの基礎がおろそかになっているように思われます。 素直に重複が発生しないように、テーブル設計を見直してはいかがでしょうか。

asamix_000
質問者

お礼

Ogre7077様、ご回答ありがとうございます。 返事が遅くなり、申し訳ありません。 教えて頂いたように記述したところ、問題なく実現できました。 ありがとうございました!

その他の回答 (1)

  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.1

口座を中心として、他の二つを外部結合する形になるかと思います 銀行情報や顧客情報が無い場合は、銀行名や顧客名が NULL となりますのでご注意ください select A.銀行No, B.銀行名, A.顧客No, C.顧客名, A.残高 from 口座 as A left outer join 銀行 as B on B.銀行No = A.銀行No left outer join 顧客 as C on C.顧客No = A.顧客No

asamix_000
質問者

補足

Ogre7077様、ご回答ありがとうございます。 これに関してもう1点だけ教えて下さい。 例題として間違っていますが、顧客データが重複していた場合、教えて頂いたSQLだと たとえ口座を中心とした場合でも、口座の情報が重複して出力されてしまうかと思われます。 顧客の情報をユニークにしてから結合させるにはどのような記述にすれば良いでしょうか、、、 初歩的な質問で申し訳ありません。 教えて下さい。

関連するQ&A

  • 内部結合

    テーブルの自己結合について教えてください。 以下のようなテーブルAがあります。 Table A collumn1(企業名) collumn2(フラグ) B           0 C           0 D           1 B           1 C           0 E           0 E           1 E           1 これにおいて、フラグが1の企業でかつ フラグの如何に関わらず同じ企業名があればその企業名を とってきたいです。 上の例では企業BとEとなります。 企業名が同じでもフラグが0のものばかりであればとってきません。 この条件を私が考えたのは select collumn1 from A where collumn2 = 0 and collumn1 = (select collumn1 from A where collumn2 = 1) というSQLなのですが、うまく取れません。 なにも取って来なくなります。 何がいけないでしょうか。 アドバイス、よろしくお願いいたします。

  • 内部結合する時の結合条件と制約条件について

    内部結合する時の結合条件と制約条件について 下記の例の場合の結合条件と制限条件の書き分けを 教えて下さい。 table1: no|type --------- 1| A 2| B 3| C 4| A 5| C table2: no|type|name|locale ------------------- 1| A |ネコ| ja 2| B |イヌ| ja 3| C |トリ| ja 4| A |cat | en 5| B |dog | en 6| C |bird| en 取得したいデータ: no|type|name ------------- 1| A |ネコ 2| B |イヌ 3| C |トリ 4| A |ネコ 5| C |トリ SQL: SELECT t1.no, t1.type, t2.name FROM table1 t1 INNER JOIN table2 t2 ON t1.type=t2.type AND t2.locale='ja' または SELECT t1.no, t1.type, t2.name FROM table1 t1 INNER JOIN table2 t2 ON t1.type=t2.type WHERE t2.locale='ja' となると思うのですが、 t2.locale='ja'の条件は 結合条件とするのと制限条件とするのとで 違いがあるのでしょうか? もし違いがない場合はどちらが一般的でしょうか? よろしくお願いいたします。

  • 外部結合について

    外部結合というのは、表と表を結合するという事で FROM句に書くべきことと思うのですが、 なぜWHERE句(カラム毎に指定)で指定するのでしょうか? 例えば、 テーブルA No|Kind|Name| ------------- 1|1 |A | 1|2 |B | 2|1 |C | 2|2 |D | テーブルB No|Kind|Data| ------------- 1|1 |10| 外部結合で SELECT A.No, A.Kind, A.Name, B.Data FROM A,B WHERE A.No = B.No(+) AND A.Kind = B.Kind(+) とすると No|Kind|Name|Data| ------------------ 1|1 |A |10| 1|2 |B |NULL| 2|1 |C |NULL| 2|2 |D |NULL| となります。 A.NoがB.NoになくてもOKで、Kindは 完全に一致しないとだめという意味で SELECT A.No, A.Kind, A.Name, B.Data FROM A,B WHERE A.No = B.No(+) AND A.Kind = B.Kind とした場合、 No|Kind|Name|Data| ------------------ 1|1 |A |10| 2|1 |C |NULL| となるのであれば納得いくのですが、 結果は↓なるようです。 No|Kind|Name|Data| -------------------------- 1|1 |A |10| (+)を一つも付けてない場合と 同じ動作になるようです。 テーブルAとテーブルBを結合するとき、 「外部結合する場合はWHERE句で指定する選択の条件全てに(+)を付ける」 「外部結合をしない場合はWHERE句で指定する選択の条件全てに(+)を付けない」 であれば、カラム毎に外部結合演算子を指定する意味が無いと思うのですが。 どなたか、カラム毎に外部結合演算子を指定する意味をご教授下さい。 宜しくお願いします。

  • 他のDBのテーブルと内部結合が可能でしょうか

    他のDBのテーブルと内部結合が可能でしょうか sql sever 2005 を使用します。このたび、データベースAのテーブルaを定期的に検索するsqlを作成することになりました。このsql文は、ストアードプロシージャとして登録予定です。 その際、テーブルbを内部結合で参照します。例として、テーブルaは社員番号があり、テーブルbは社員番号、社員名があります。(テーブルbは社員マスター) テーブルaを参照し、その社員名を内部結合(INNER JOIN)で取り出します。 ここで、テーブルa,bが共に、同じデータベース内にある場合は、問題ないのですが、 テーブルbは、別のマシンのsql sever 上にあります。(したがって、データベース名も異なります) このような状態で、内部結合による参照は可能でしょうか? また、内部結合ができないまでも、ストアードプロシージャで、データベースAのテーブルaを参照しながら、別のマシンのデータベースBのテーブルbを参照することは、原理的に可能でしょうか。 なお、データベースは共にsql server 2005を使用します。

  • ACCESSのテーブル結合に関して

    初歩的な事で申し訳ありませんが、教えて下さい。 以下のように3つのテーブルが存在し、検索条件をBテーブルの仕入先コードが"AAA"と 指定した際に、 発注番号、発注日付、仕入先コード、仕入先名 という形でOUTPUTしようと考えています。 その場合、クエリではどのように結合すれば良いでしょうか。。。 Aテーブルの発注番号とBテーブルの発注番号、Bテーブルの仕入先コードとCテーブルの 仕入先名という結合の形では、条件の"AAA"が1件しかないにもかかわらず、複数件出力されて しまうかと思われます。 《テーブル内容》 Aテーブル 発注番号 発注日付 Bテーブル 発注番号 仕入先コード Cテーブル 仕入先コード 仕入先名 ※ Bテーブル、Cテーブルの仕入先コード"AAA"は、それぞれ1件ずつしかない。 教えて頂きたいと思います。

  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどでinner joinを使った複数のテーブル結合が参考として 書いてあったのですが(3つまで), 4つテーブルを結合する事は 出来るのでしょうか? A,B,CテーブルにはID,NAMEがあります。 DテーブルにはA,B,CテーブルのIDがあります。 参考サイトを見て3つのテーブルを結合するSQLが以下になります。 SELECT a.name, b.name, c.name FROM a INNER JOIN (b INNER JOIN c ON b.id = c.id) ON a.id = c.id よろしければアドバイスお願いします。

  • 【SQL文】このような結合UNION?できますか?

    SQL文でテーブルを結合し、insertしたいと思っています。 例) テーブル名:tb1, カラム:A1,A2 テーブル名:tb2, カラム:B1(b1,b2,b3,,,,) テーブル名:tb3, カラム:C1(c1,c2,,,,,,) tb2とtb3を結合させてtb1へinsertしたいと思いますが、 tb2とtb3リレーションを組める要素がありませんし、データの型も違います。 |A1 | A2 __|____|_____ 1 |b1 |c1 _____________ 2 |b1 |c2 _____________ 3 |b2 |c1 _____________ 4 |b2 |c2 _____________ 上記のような結果を作ってtb1へINSERTしたいのですが、UNION結合を使えるのか どうかすらわかりません。ネットで調べたのですが、突破孔を見つけることができ ませんでした。 ちなみにACCESSで結合までの結果を得るのに、SELECT B1.tb2,C1.tb3 from tb2,tb3 という文で出せましたが,mySQLではダメでした。 どなたかご教授おねがいできますでしょうか?

    • ベストアンサー
    • MySQL
  • テーブル結合について

    テーブルの結合についてお聞きしたいことがあります。 カラム「KEY」を結合条件に テーブルA、B、Cを結合して【取りたい結果】のようなデータを取りたいと思っています。 しかし、テーブルAにBとCをLEFT JOINを結合した所、 【取得された結果】のデータが取得されました。 どのような結合をしたら期待通りの結果が得られるのでしょうか? 回答宜しくお願いします。 【取得された結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 B-1 C-2 A-1 B-1 C-3 2 A-2 3 A-3 【取りたい結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 C-2 A-1 C-3 2 A-2 3 A-3 【テーブルA】 key dataA --------------------- 1 A-1 2 A-2 3 A-3 【テーブルB】 key dataB --------------------- 1 B-1 【テーブルC】 key dataC --------------------- 1 C-1 1 C-2 1 C-3

  • 内部結合で3つ以上テーブルを指定する事は可能でしょうか?

    内部結合で2つテーブルを指定するには、下記ですが、 3つ以上の場合、どのような書けば良いのでしょうか? SELECT 部署No,部署名,場所,従業員No,従業員名 FROM 部署 D,従業員 E WHERE D.部署No = E.部署No;

  • ACCESS n対nのデーターを結合したいのですが・・・。

    お知恵をかしてください。 Aテーブル No   商品名  金額 1     AAA  1,111 3     CCC1  3,333 3     CCC2  3,333 5     EEE  5,555   Bテーブル No   商品名    金額 1    AAAAA   11,111 2    BBBBB   22,222 4    DDDDD   44,444 5    EEEEE1   55,555 5    EEEEE2  55,555 をNOで結合して Cテーブル AかBNo A商品    A金額     B商品   B金額 1     AAA    1,111    AAAAA  11,111 2     ブランク           BBBBB  22,222 3     CCC1    3,333    ブランク 3     CCC2    3,333    ブランク 4     ブランク          DDDDD   44,444 5     EEE     5,555   EEEEE1  55,555 5     ブランク          EEEEE2  55,555 というテーブルを作成したいのですが、(AテーブルBテーブルのNoが一緒だったら1行目は行を1行にしたい。)ということは可能でしょうか? 詳しい方教えてください。