• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:テーブルを結合)

テーブルを結合する方法とは?

このQ&Aのポイント
  • 複数のテーブルを結合するためには、INNER JOINを使用します。
  • 特定のカラムを基準にテーブルを結合することができます。
  • 4つのテーブルを結合することも可能です。

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

  • ベストアンサー
  • dda167
  • ベストアンサー率76% (55/72)
回答No.3

むつかしく考えすぎておられるのでは? IDを主キーにするなら、 【tableA】 id name 1 西部ライオンズ 2 読売ジャイアンツ 【tableB】 id name 1 中島 2 中村 3 小笠原 4 ラミレス 【tableC】※numberは型なのでnbrとしました id nbr 1 0 2 1 3 2 4 3 【tableD】 tablea_id tableb_id tablec_id 1 1 1 1 2 2 2 3 3 2 4 4 SELECT a.name, b.name, c.nbr FROM tableD d INNER JOIN tableA a ON a.id = d.tablea_id INNER JOIN tableB b ON b.id = d.tableb_id INNER JOIN tableC c ON c.id = d.tablec_id この場合、tableA、tableB、tableCはマスタで 各テーブル間に関連はなく、tableDで関連付けてやるわけです。 tableA、tableB、tableC、各テーブル間で関連を持たせるのであれば、 【tableA】 id name 1 西部ライオンズ 2 読売ジャイアンツ 【tableB】※id1がtableAのidと対応 id1 id2 name 1 1 中島 1 2 中村 2 1 小笠原 2 2 ラミレス 【tableC】 id1 id2 nbr 1 1 0 1 2 1 2 1 2 2 2 3 SELECT a.name, b.name, c.nbr FROM tableA a INNER JOIN tableB b ON a.id = b.id1 INNER JOIN tableC c ON b.id1 = c.id1 AND b.id2 = c.id2 関連付けするためのtableDは不要となります。 tableCが何を意味するテーブルなのか、 私にはわからないので一応上のようにしてみました。 tablaBとtableCが一対一対応… 例えば「巨人軍の小笠原の背番号は2である」 というような場合は、そもそもテーブルを分ける必要はなく、 【tableA】 id name 1 西部ライオンズ 2 読売ジャイアンツ 【tableB】 id1 id2 name nbr 1 1 中島 0 1 2 中村 1 2 1 小笠原 2 2 2 ラミレス 3 SELECT a.name, b.name, b.nbr FROM tableA a INNER JOIN tableB b ON a.id = b.id1 でもよいわけです。 質問のタイトルは「テーブルを結合」でしたよね。 何を説明しているのでしょうね……わたし(笑)

NeilMania
質問者

お礼

メッセージありがとうございます。 なんかマラソン大会で誘導係りを無視して 一人遠回りしてるぐらい自分のは無駄な事が多いデスね… 凄く勉強になりました。ありがとうございます。せっかくの土曜日に…(笑) 朝早くから一日中やってしまいました…アハハ

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • dda167
  • ベストアンサー率76% (55/72)
回答No.2

IDは主キーじゃないのですか?すごいテーブルですね(笑) Dテーブルの1行目、BID=1で「片岡」が Dテーブルの3行目、BID=1で「ひちょり」が 選択される理由を教えてください。

NeilMania
質問者

お礼

メッセージありがとうございます。 今のテーブル構造だとデータが重複されるので無理ですね…。 すいません、ちょと考えなおして見ます。

NeilMania
質問者

補足

テーブル構造を変えて見ました。 このテーブル構造がいいのかわかりませんが、弱い頭を使って 変更してみました…。 【tableA】 id name 1 西武ライオンズ 2 読売ジャイアンツ 【tableB】 id tableb_id tablec_id name 1 1 1 中島 2 1 2 中村 3 2 1 小笠原 4 2 2 ラミレス 【tableC】 id tableb_id tablec_id number 1 110 2 121 3 212 4 223 【tableD】 id tablea_id tableb_id tablec_id 1 1 1 1 2 1 1 2 3 2 2 1 4 2 2 2 SELECT tablea.name, tableb.name, tablec.number FROM tableA, tableB, tableC, tableD WHERE tableA.id = tableb.tableb_id AND tableB.tableb_id = tableC.tableb_id AND tableB.tablec_id = tableC.tablec_id AND tableD.tablea_id = tablea.id AND tableD.tableb_id = tableb.tableb_id AND tabled.tablec_id = tablec.tablec_id 非常に醜いですが…inner joinだとわからないので このSQL文にしてみようかと思っています。

すると、全ての回答が全文表示されます。
  • dda167
  • ベストアンサー率76% (55/72)
回答No.1

DテーブルにあるIDの組み合わせでデータを取得したいのですか? SELECT a.name, b.name, c.name FROM d INNER JOIN a ON a.id = d.aid INNER JOIN b ON b.id = d.bid INNER JOIN c ON c.id = d.cid この種の質問をするときは、サンプルデータと望む結果を挙げましょう。

NeilMania
質問者

お礼

メッセージありがとうございます。 すいません、説明が足りず…。 以下がサンプルデータになります。 Aテーブル ID NAME 1 西武ライオンズ 2 日本ハム Bテーブル ID NAME 1 片岡 2 中村 1  ひちょり    Cテーブル ID NAME 1 0番 2 1番 1 0番 Dテーブル AID BID CID 1    1   1 1   2  2 2   1   1 出力データとしてはDテーブルに各テーブルのIDがあり そのIDを元にデータを出力するSQL文を考えております。 西武ライオンズ   片岡 0番 西武ライオンズ 中村    1番 日本ハム    ひちょり 0番 よろしければアドバイスよろしくお願いいたします。

すると、全ての回答が全文表示されます。

関連するQ&A

  • テーブル結合について

    SQL Serverで、メイン、サブ1、サブ2、サブ3、サブ4というテーブルがあり、以下のSQLを実行すると、メインにあるすべてのデータ(10列)が抽出されます。 SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id しかし、上記のSQL文に追加して、 SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id INNER JOIN サブ4 ON メイン.name4=サブ4.id とすると、メイン内の10列のうち、2列しか抽出されません。 サブ4を結合しても、一つ目のSQL文と同じ結果を抽出したかったのですが、どこがおかしいのでしょうか? SQL文がまずいのか、サブ4のテーブル内容のせいなのか、SQL Serverの設定がおかしいのか、さっぱり見当がつきません。 足りない情報がありましたら補足いたしますので、どうぞよろしくお願いします。

  • データーベースの結合について

    はじめまして。 先日異動で新しい職場につき、マイクロソフトアクセスを使用し始めたド初心者です。 早速ですが教えてください。 使用しているアクセスは2000です。 http://okweb.jp/kotaeru.php3?q=246849 ↑にて参考にさせていただきましたが、 SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id のようにテーブルを4つ結合したいのです。 現在、2つのテーブルを結合することはできましたが、 3つ以上のテーブルの結合ができずに困っています。 上記のようにやってみると 「構文エラー:演算子がありません」と表示されます。 .ASPという拡張子のものですがそれがいけないのでしょうか? (正式には SQL = "SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id" と、1行で書かないと認識しません SQL = "SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id" とするとエラーになります。 ) 以前、勤めていた方の仕事を引き継いだのですが聞ける人もいないので途方にくれています。 質問自体がおかしいかもしれませんがどうぞ初心者にも理解できる回答をよろしくお願いします。

  • 複数テーブルの結合

    マスターテーブル1つと、子テーブルが複数存在して子テーブルにはマスターテーブルのidを格納するフィールドがあり参照しなくなったときにはそのidを消去するといったデータベースがあったときにマスターIDごとに子テーブルのどれか1つでも参照していればカウントするみたいなSQLをつくりたいんですが select count(m.id) from master m inner join a on m.id = a.m_id inner join b on m.id = b.m_id inner join c on m.id = c.m_id group by m.id みたいなSQLだとAにデータが存在しなければB以降に存在しても期待した結果が出力されません。A、B、Cいずれかのm_idとマスター側のIDが等しければカウントするという出力をするためにはどのように書けばいいんでしょうか。 わかりづらい説明で申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • MySQL
  • 複数テーブルを結合するには?

    OS:WINDOWSXP SP2 ORACLE:Oracle9i Enterprise Edition Release 9.2.0.1.0 A, B, Cというテーブルがあるとします。 それぞれのテーブルには XXカラムと YYカラムがあるとします。 2つのテーブルを結合させるには、以下のSQL文を記述すれば良いと考えています。 SELECT A.*,B.* FROM A JOIN B ON A.XX = B.XX 3つのテーブルを結合するには、以下のSQL文を記述しています。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX JOIN C ON A.XX = C.XX 但し、この記述方法でいきますと、Cテーブルを右側外部結合に指定した場合のみ、 ORA-00904 "C" 無効な識別子です。 というエラーメッセージが表示されます。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX RIGHT OUTER JOIN C (←LEFT OUTER、FULL OUTER)なら通ります) ON A.XX = C.XX 何故、右側外部結合のみ不正となるのか不明であり、解決策が見つかりません。 複数のテーブルを結合する為のSQL文の記述方法を教えて頂けますでしょうか?

  • 3つのテーブルを結合した場合のWHERE

    MySQLで3つのテーブルを結合した場合のWHEREがよくわかりません。 まず、下のような2つのテーブルがあるとします。 【テーブルaa】 ID | Name -------------- 1 | x 2 | y 3 | z 【テーブルbb】 ID | hizuke | category --------------------- 1 | stamp1 | a 1 | stamp2 | b 1 | stamp3 | c 2 | stamp1 | a 2 | stamp2 | d 3 | stamp1 | c この2つのテーブルを結合して、同じIDでhizukeが最大値のデータを抽出するクエリは、 http://okwave.jp/qa/q6918385.htmlを参考にして、 SELECT aa.Name, bb.category FROM bb INNER JOIN aa ON aa.ID = bb.ID where (bb.ID, bb.hizuke) in (SELECT bb.ID, max(bb.hizuke) FROM bb group by bb.ID ) ; でできました。 しかし、もう1つテーブルを結合すると期待した結果が得られなくなってしまいました。 【テーブルcc】 category | choice --------------------- a | ss b | tt c | uu というテーブルがあって、上のクエリで得られた bb.categoryと cc.categoryをリンクして、choiceを取得しようとしたのですがうまくいきません。 SELECT aa.Name, bb.hizuke, bb.category, cc.choice FROM bb INNER JOIN cc ON bb. category = cc. category INNER JOIN aa ON aa.ID = bb.ID where (bb.ID, bb.category, bb.hizuke) in (SELECT bb.ID, bb.category, max(bb.hizuke) FROM bb group by bb.ID ); というクエリでは、ダメなようです。 INNER JOINを入れ子にしたり、いろいろと試したのですがどうにもうまくいきません。 どうも私の力では解決困難なようです。どなたかヘルプを。

  • テーブル結合について、下記SQLをANSI結合の書き方で表したい。

    テーブル結合について、下記SQLをANSI結合の書き方で表したい。 select * from (select key from A union select key from B union select key from C) X, A,B,C where X.key=A.key(+) and X.key=B.key(+) and X.key=C.key(+) このSQLをANSI結合の記述で書きたいのですが、 (+)での結合文になれておらず試行錯誤しております。 下記のようなのかなとは模索しておりますが、 手元に実行環境がなくわかりません。 また、要所気付く点などありましたら、ご指摘願います。 select A.*, B.*, C.* from (select key from A union select key from B union select key from C) X, LEFT JOIN A ON X.key=A.key LEFT JOIN B ON X.key=B.key LEFT JOIN C ON X.key=C.key

  • group by句

    色々と試行錯誤してやっていますが、なかなか自分の 思うような結果が得られないためご質問させて下さい。 テーブルが全部で3つあります。 テーブルA id name 1 巨人 2   西武 テーブルB id name 1 小笠原 2 ラミレス 3 中島 4  片岡 テーブルC id テーブルAID テーブルBID 背番号 1 1 1 30 2 1 2 10 3 2 3 3 4 2 4 8 テーブルを結合し、テーブルCにある 背番号をテーブルAid,テーブルBidを元に sumしたいのですがうまくいきません。 以下がそのSQLになります。 (1)サブクエリーを使ったSQL この場合値が重複されて表示されてしまいます。 select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id group by c.テーブルAid ), (select sum(背番号) from tableC c where c.テーブルBid = bid group by c.テーブルBid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid (2) select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id ), (select sum(背番号) from tableC c where c.テーブルBid = bid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid group by c.テーブルAid 重複はされないのですが、group byが一つのみなので ちゃんとした出力がされません。    他にやり方があるのかもしれませんが、お分かりになる方が    いらっしゃいましたら、ご教授お願い致します。

  • テーブルの結合に付いて

    こんにちわ 2つのテーブルからデータを検索する方法に関してです。 テーブル AとB が有り、 お互いに、フィールド ExtID で関連付けがされているとします。 ここで、 SELECT A.NAME, B.ADDRESS FROM A INNER JOIN B ON A.ExtID = B.ExtID とする方法と SELECT A.NAME, B.ADDRESS FROM A,B WHERE A.ExtID = B.ExtID が有ります。 この2つに関して、違いとかメリット・デメリット有りましたら教えてください。 よろしくお願い致します。

  • テーブルの結合について

    以下の二つを実行すると、2 の方がかなり速いのですが理由が分かりません。 分かる方教えてもらっていいですか? DBはMYSQLでInoDBです。 ちなみに Aは1万件、B は10万件ほど 1 のSQL SELECT * FROM A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) B ON A.id = B.XXX WHERE ・・・ GROUP BY A.id 2 のSQL (SELECT * FROM A ・・・ GROUP BY ID ) A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) ON A.ID = B.XXX.ID

  • 多段外部結合はできる?

    mysqlにおいて、多段の外部結合はできるのか今模索しております。 例えば、A、B、Cと3つテーブルがあった場合に、 「Aに対してBを外部結合」 「Bに対してCを外部結合」 としたいのですが、どうやってもCテーブルの値が取得できず常にNULLになっている状態です。 例として、以下の条件で実行すると、Cテーブルの値が取得できません。 ---- (テーブル) A [id, name, b_id] ※b_idはB.idの外部キー B [id, name, c_id] ※c_idはC.idの外部キー C [id, name] (クエリ) select A.name, B.name, C.name from A left join B on (A.b_id = B.id) left join C on (B.c_id = C.id) ---- どうやったらうまく取得できますか?もしくはできないのでしょうか? ご存知の方、ご教授ください。

    • ベストアンサー
    • MySQL
このQ&Aのポイント
  • 製品名: DCP-J4140N
  • 環境: Windows10, 無線LAN接続
  • 問題: スキャンデータをPDFで保存したいが、JPGで保存されてしまう
回答を見る

専門家に質問してみよう