SQLの結合について
- データベース初心者のためのSQL結合についての解説
- テーブルAとテーブルBの結果を結合する方法について詳しく解説します
- データベース初心者でも理解しやすいSQL結合の基本的な使い方を紹介します
- ベストアンサー
SQLの結合について
データベース初心者です。 使用しているデータベースは、DB2です。 質問ですが、テーブルAとテーブルBに対して、それぞれにSelect文を実行した結果があるとして、その2つの結果を結合することは可能でしょうか? テーブルAに対し、Select文を実行した結果 氏名 年齢 ID --------------------- ○○○ 50 00001 △△△ 20 00002 ××× 30 00003 テーブルBに対し、Select文を実行した結果 出身地 住所 管理No --------------------- ■■■ あああ 00001 ◆◆◆ いいい 00002 ●●● ううう 00003 上記2つの結果を結合して以下のような結果を求めたい。 氏名 年齢 ID 出身地 住所 ----------------------------------------------- ○○○ 50 00001 ■■■ あああ △△△ 20 00002 ◆◆◆ いいい ××× 30 00003 ●●● ううう ご教授のほどお願い致します。
- zuraoyaji
- お礼率20% (7/34)
- その他(データベース)
- 回答数1
- ありがとう数0
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
SELECT テーブルA.氏名, テーブルA.年齢, テーブルA.ID ,テーブルB.出身地, テーブルB.住所 FROM テーブルA JOIN テーブルB ON テーブルA.ID = テーブルB.管理No
関連するQ&A
- SQLのテーブル結合
SQLのSELECTについて質問です。 テーブルA、B、Cから情報を取得し、下記の画面イメージを表示させたいのですが、 どのようにテーブルを結合すればよいか判りません。 どなたかご教示ください・・・。よろしくお願いします。 #テーブルCから組名を取得するような処理は画面表示のロジックで行います。 #テーブルA、Bの結合についてのみ、教えていただきたいです。 条件 ・氏名と、所属情報の○×を表示したい ・DISTINCT等、重たい処理は避けたい 画面イメージ |氏名 |赤組|白組|青組| ------------------------------ |山田太郎|○ |× |× | |山田花子|× |○ |○ | テーブルA |個人ID|氏名 | -------------------- |000001|山田太郎| |000002|山田花子| テーブルB |個人ID|組コード| -------------------- |000001|1110 | |000002|1111 | |000002|1112 | テーブルC |組コード|組名| ------------------ |1110 |赤組| |1111 |白組| |1112 |青組|
- ベストアンサー
- Oracle
- SQLの結合条件について
SQLの結合条件について ・table_A ID | ATAI 01 | AAA 01 | XXX 02 | ABC 03 | DEF table_B ID | ATAI 01 | 不要 02 | 必要 03 | 必要 04 | 不要 上記のようなテーブルAとBがあるとします。 やりたいこと 1.テーブルAに存在するIDをBのIDから抽出 2.テーブルAの「ATAI」の値が’AAA’のIDは抽出対象から外す。 ※テーブルAの01IDに’AAA’と’XXX’がありますが、Bの抽出対象から外したい。 2.がうまくいきません。 select B.ID from table_A A,table_B B where A.ID = B.ID 上記のSQLに2.の条件を足して、結果を02と03にしたいです。 ※CASEは使わずにお願いします。
- ベストアンサー
- Oracle
- ACCESS SQL 左結合しなければならない理由
ACCESSで作成されたVBAのSQLコードを理解しているのですが、 テーブルAは番号、氏名、住所、年、月、・・・ テーブルBは番号、身長、体重、・・・ という2つのテーブルがあって、 式(1)のSQLでは、 テーブルAにテーブルBを左結合しているのですが、 なぜ左結合しなければならないのかがよく分かりません。 この後、 rst.Open strSQL, CurrentProject.Connection Do Until rst.EOF str氏名 = rst!氏名 (省略) rst.MoveNext Loop rst.Close Set rst = Nothing で氏名を取り出しているだけで テーブルBのフィールドは何も使っていないようなので、 素人の私には、テーブルBを左結合しなくても、 式(2)のSQLでいいように思えるのですが、 式(1)と式(2)で何か違いがあるのでしょうか。 --式(1)---------------------------------------- strSQL = _ "SELECT テーブルA.年, テーブルA.月, テーブルA.住所, テーブルA.番号, " & _ "テーブルA.氏名 " & _ "FROM テーブルA LEFT JOIN テーブルB ON テーブルA.番号 = テーブルB.番号 " & _ "GROUP BY テーブルA.年, テーブルA.月, テーブルA.住所, テーブルA.番号, " & _ "テーブルA.氏名 " & _ "HAVING テーブルA.年 = '" & 指定年 & "' AND テーブルA.月 = '" & _ 指定月 & "' AND テーブルA.住所 = '" & 指定住所 & "' " & _ "ORDER BY テーブルA.年, テーブルA.月, テーブルA.番号" --式(2)---------------------------------------- strSQL = _ "SELECT テーブルA.年, テーブルA.月, テーブルA.住所, テーブルA.番号, " & _ "テーブルA.氏名 " & _ "FROM テーブルA & _ "GROUP BY テーブルA.年, テーブルA.月, テーブルA.住所, テーブルA.番号, " & _ "テーブルA.氏名 " & _ "HAVING テーブルA.年 = '" & 指定年 & "' AND テーブルA.月 = '" & _ 指定月 & "' AND テーブルA.住所 = '" & 指定住所 & "' " & _ "ORDER BY テーブルA.年, テーブルA.月, テーブルA.番号" ------------------------------------------------ よろしくお願いします。
- ベストアンサー
- その他MS Office製品
- 巨大テーブルの外部結合
巨大なテーブル同士を結合する際に、みなさんはどのように結合されますか?もっともパフォーマンスのある方法を模索しているところです。 テーブルA:約900万件 テーブルB:約400万件 テーブルAのインデックスはカラム:idです。 テーブルBにはインデックスはありません。 取得したいのはBテーブルに含まれるAテーブルのidの件数です。 select count(id) from B where A.id = B.id なんてやると、数時間かかります。 select count(id) from B where exists(select * from A where A.id = B.id) ですと、約3hぐらいかかりました。 inで実行すると等価結合したときと変わらないぐらいになります。 こういう場合、皆さんはどう結合されていますか? お知恵を拝借できると幸いです。 ちなみにoracle 8iです。 よろしくお願いいたします。
- 締切済み
- Oracle
- 条件付き外部結合について
表A:ID、氏名 表B:ID、氏名 の2表を結合したいのですが、条件が 1.BのID <> 0 のときはIDで結合 2.BのID = 0 のときは氏名で結合 3.マッチしない、Bに存在しない場合はAのみ表示 となっています。 SELECT A.ID,A.氏名,B.ID,B.氏名 FROM A,B WHERE A <> 0 AND A.ID = B.ID(+) UNION SELECT A.ID,A.氏名,B.ID,B.氏名 FROM A,B WHERE A = 0 AND A.氏名 = B.氏名(+) では、よけいな行が選択されてしまいます。 なにかよいアイデアはないでしょうか?
- 締切済み
- Oracle
- 【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
- 【SQL】existsでの商演算
閲覧ありがとうございます. 現在SQLでデータベースの勉強をしているのですが,existsを用いて商演算を行おうとしてわからない箇所が出てきたので,その点に関しての質問をさせて頂きます. 例として,A,Bと名付けた2つのテーブルを最初に用意します. [テーブル1(名前:机1)] | 番号 |氏名|年齢| 好物 | --------------------------- | 12 | あ | 1 | りんご | | 23 | い | 1 | すいか | | 23 | い | 1 | りんご | | 45 | え | 3 | すいか | | 45 | え | 3 | りんご | [テーブル2(名前:机2)] | 好物 | ---------- | りんご | | すいか | この机1を机2で割ることで,この要素を含む氏名を取り出したいと考えて,以下のようなSQL文を実行しました. select 氏名 from 机1 A where exists( select * from 机2 B where A.好物 = B.好物); [求めている結果表示] | 番号 |氏名| ------------- | 23 | い | | 45 | え | [実際に表示された結果] | 番号 |氏名| ------------- | 12 | あ | | 23 | い | | 23 | い | | 45 | え | | 45 | え | 実行すると (1)氏名が重複で表示されてしまう (2)「りんご」のみ好物の「あ」も表示されてしまう という問題が発生してしまい,色々と調べて考えたものの,結局分からなかったので,今に至ります. 長文・駄文すみませんでした. まだSQLを学び初めて少ししか経っていないので,全く違うことをしていたらすみません.よろしければ,問題解決へのアドバイスをお願いします.
- ベストアンサー
- PostgreSQL
- 外部結合について
こんばんは。 SQLでの外部結合について教えてください。(オラクルの場合です) データを取得しいテーブルが4つあったとします。 Aテーブルのキーは、「ユーザーID」と「名前」と「住所」だとします。 Bテーブルのキーは、「名前」と「郵便番号」とします。 Cテーブルのキーは、「名前」と「郵便番号」とします。 取得したいデータは、全てのテーブルに存在しています。 Aテーブルに対してBテーブルとCテーブルを外部結合したいと思っています。 Aテーブルには「ユーザーID」があります。 Bテーブルからは、「給料」データが取得したいのです。 Cテーブルからは、「年齢」データが取得したいのです。 B,Cのテーブルに条件に合致するものがなくても、AのユーザーIDだけは 表示したいと思っています。 自分なりに考えて色々試したのですが、うまく行かず構文でエラーになります。 どうしてもAテーブルに外部結合したいです。 SELECT A.ユーザーID, B.給料, C.年齢 FROM A, B, C WHERE A.ユーザーID = ’XXXXX’, A.名前 = ’AAAAAA’, A.住所 = ’KKKKKKKKKKK’, A.名前(+) = B.名前, A.名前(+) = C.名前, A.郵便番号(+) = B.郵便番号, A.郵便番号(+) = C.郵便番号 このように考えたのですが,「すでに1つの表と外部結合されています」みたいに エラーがでてしまいます。 どのように修正すれば、よいのでしょうか? よろしくお願い致します。 ※全角になっているなどは、見やすくする為にやっています。
- ベストアンサー
- その他(データベース)
- Oracle10gで1つのSQLで複数回同じテーブルを結合する場合のパ
Oracle10gで1つのSQLで複数回同じテーブルを結合する場合のパフォーマンス向上 Oracleで1つのSQL内で同じテーブルを2回以上結合すると結果出力にかかる時間が非常に遅くなります。 例: SELECT * FROM A, B b1, B b2 WHERE a.id = b1.id AND a.id = b2.id (テーブルBを2回結合している) こういう場合にパフォーマンスを落とさない方法はありますか?テンポラリテーブルでテーブルBのレプリカを作成して使用するというのはなしです。あくまで1つのSQLで結果出力できることを前提にパフォーマンスを向上する方法を教えてください。
- ベストアンサー
- Oracle
- SQL HAVING句の使い方について
以下のテーブルAとテーブルBを結合して結果テーブルを出力したいと考えています。 (テーブルA上のIDのカウントした数をテーブルBに結合して出力したい。) テーブルA ----------- CATE ID aaa 001 bbb 001 ccc 003 ddd 004 テーブルB ----------- ID NAME 001 101 002 102 003 103 004 104 結果テーブル ---------------------- ID NAME COUNT 001 101 2 002 102 0 003 103 1 004 104 1 そこで、 =================================== SELECT B.ID, B.NAME, COUNT(A.ID) FROM TABLE_A B, TABLE_B B GROUP BY B.ID, B.NAME, A.ID HAVING A.ID = B.ID =================================== とSQLを書いてみましたが、 002 102 0 のテーブルAにIDが存在していない列が結果として表示されませんでした。 WHERE句でいう「WHERE A.ID =* B.ID」のようなことを行いたいのですが、どのように行えばよいでしょうか? よろしくお願いいたします。
- ベストアンサー
- Oracle
補足
説明不足で申し訳ございません。 やりたいことは、 テーブルBに対し、以下コマンドを実行したうえで、テーブルAと結合を行いたいと思っております。 select 出身地,住所,管理No from テーブルB お手数をおかけしますが、宜しくお願い致します。