[初心者]A表の2つの値からB表を検索する

このQ&Aのポイント
  • 初心者でもわかるSQL文の書き方を教えてください。
  • A表のB_ID_1とB_ID_2の値を使用してB表のIDとnameを検索する方法を教えてください。
  • SQL文を勉強するにはどのサイトがおすすめですか?
回答を見る
  • ベストアンサー

[初心者]A表の2つの値からB表を検索する。

初心者でいろいろと調べてみたのですが、どうしてもわかりませんでした。分からないので質問します。 A表 ID | B_ID_1 | B_ID_2 1 | 1 | 5 2 | 2 | 6 3 | 2 | 1 B表 ID | name 1 | 1a 2 | 2b 3 | 3c 4 | 4c 5 | 5c 6 | 6c とあった時 、以下の結果を出力したいのです。 ID | B_ID_1 |ID_1_name| B_ID_2|ID_2_name| 1 | 1 | 1a | 5  | 5c 2 | 2 | 2b | 6 | 6c 3 | 2 | 2b | 1 | 1a A表のB_ID_1 B_ID_2 からB表のIDを検索して一つの表にしたいとおもっているのですが、どのようなSQL文を記述してよいかが分かりません。 また、SQL文を勉強するのに良いサイトがありましたらお教えください。 よろしくおねがいします。

  • koipo
  • お礼率88% (16/18)
  • MySQL
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

推察ですが、A表のB_ID_1列と、B_ID_2列にB表の対応する名前を表示 するという前提でお話します。 B_ID_1、B_ID_2 は別々のフィールドなので、各々に結合させます。 SELECT A.ID, A.B_ID_1,X.name AS ID_1_name, A.B_ID_2,Y.name AS ID_2_name FROM (A表 A INNER JOIN B表 X ON A.B_ID_1=X.ID) INNER JOIN B表 Y ON A.B_ID_2=Y.ID (1)使うテーブルはA表、B表×2なので、それぞれを識別するために  別名(相関名という)を割り当てます。A表→A、B表(その1)→X  B表(その2)→Y (2)最初の列はA表のIDなので、A.IDとなります。(SELECTの直後) (3)次はA表のB_ID_1と、対応するB表(その1)のnameです。  列名として「ID_1_name」をAS句で割り当てます。(2行目) (4)最後はA表のB_ID_2と、対応するB表(その2)のnameです。  列名として「ID_2_name」をAS句で割り当てます。(3行目) (5)結合式はA表のB_ID_1とB表(その1)のID、及びA表のB_ID_2と  B表(その2)のIDです。(FROM句 以降の書き方を参照) 相関名.列名で、フィールドを特定しています。列名に同じものが 無ければ、修飾しなくても良いのですが、本例ではB表が2個ある ので、どちらの方のデータかを明示的に指示する必要があります。 尚、B_ID_1やB_ID_2の値がB表に無いデータは表示されません。 もし、B表に無くても表示させたい(nameの所はNullになる)場合は 予約語"INNER"を"LEFT"にしてください。

koipo
質問者

お礼

もとめていた情報を出すことができました。 本当にありがとうございました<_o_>

その他の回答 (1)

  • level2012
  • ベストアンサー率63% (12/19)
回答No.1

テーブルの設計を考え直した方がよろしいのではないでしょうか? そのような場合は、B_ID_1 と B_ID_2 というテーブルを用意したらどうですか?

koipo
質問者

お礼

お返事ありがとうございます。 テーブル設計はソフトハウスが設計して、ソフトハウスが潰れたため 悩ましい状態です。 恐ろしくして、Select文しか発行できないのが現状です。

関連するQ&A

  • MySQLの検索について

    MySQLの検索について id | name | price 1 | A | 100 2 | B | 1200 3 | A | 150 4 | A | 175 5 | B | 1150 6 | C | 500 7 | C | 600 8 | D | 300 仮にこのようなテーブルがあったとします。 このテーブルを、以下の形で出力したいのです。 A | 100 A | 150 A | 175 B | 1150 B | 1200 C | 500 C | 600 next page(D以下は次のページ以降で表示) つまり、nameの項目は指定した項目数だけを出力。 1ページに表示するnameの数は決まっている。 ただし、表示されるnameにあたるレコードは数に関係なく全て出力し、nameごとにpriceでソートする。 クエリーを2回発行し、プログラム側での処理を交えれば実現できるのですが、できればDBに問い合わせる回数は減らしたいと考えています。 上記の事を1度で実現するSQLが存在する、あるいはより優れたやり方があるのでしたら、ご教授いただければ幸いです。

    • ベストアンサー
    • MySQL
  • 検索フォーム nameがAもしくはBもしくはCの値が○○であれば、結果を表示させる

    以下のような検索フォームはできるでしょうか? 「name=AもしくはBもしくはC の値が○○であれば、結果を表示させる」 <SELECT name="AもしくはBもしくはC"> <OPTION value=""> 月を選択 </OPTION> <OPTION value="01">1月</OPTION> <OPTION value="02">2月</OPTION> <OPTION value="03">3月</OPTION> <OPTION value="04">4月</OPTION> </SELECT> 初心者なので、教えていただけると助かります。 よろしくお願いします。

  • JOINを使ったSQL文を作成しようとしています。

    JOINを使ったSQL文を作成しようとしています。 以下の様な3つのテーブルがある場合のSQL文を教えて下さい ※勉強の為、適当なテーブルを作成しましたが、やりたい事は  JOINの中に更にJOINさせたSQL文を作成したいと思ってます 表A  USER_ID(プライマリキー)  NAME 表B  USER_ID(プライマリキー) ※表A.USER_IDと紐着く  BUMON(プライマリキー)  TERM(プライマリキー) 表C  BUMON(プライマリキー) ※表B.BUMONと紐着く  TERM(プライマリキー) ※表B.TERMと紐着く  MEMBER 【取得したい項目】  表A.USER_ID 【抽出条件】  表CのMEMBERの値が'10','20'以外(である表AのNAMEを取得)

  • SQLの勉強を始めたばかりの初心者です。

    SQLの勉強を始めたばかりの初心者です。 2つのテーブルを結合し、以下のような結果を求めるSQL文はどう記述したら良いのでしょうか? アドバイス頂きたく、よろしくお願い致します。 【テーブル1】 ID  Data  Name ------------------------------------------------ 1  AAA   あいう 5  BBB   かきく 7  CCC   さしす 8  DDD   たちつ ------------------------------------------------- 【テーブル2】 ID  Information  Index -------------------------------------------------- 5   Error     100 8   Check    200 15  Warnning   300 20  Non      0 -------------------------------------------------- 【取得したい結果】 ID  Data  Name  Information   Index ------------------------------------------------- 1  AAA   あいう 5  BBB   かきく  Error      100 7  CCC   さしす 8  DDD   たちつ  Check     200 15             Warnning   300 20             Non      0 ------------------------------------------------- つたない説明で申し訳ありません… なお使用しているのはSQL Server 2008です。

  • 検索結果の値を返すマクロ

    以下のような表で列「A」にある値を「C1~I1」より検索し 一致するものがあれば、列名を「B列」に返すマクロを作りたいのですが、どのようにマクロを記述したら良いでしょうか? A  B  C  D   E   F   G   H   I       10 20 30 40 50 60 80 10 20 10 50 60 勉強してみたのですが、変数をどのように使っていいか判りません。 ご助言いただければと思います。

  • LEFT OUTER JOIN でB表の制限付きで表示したいのですが

    はじめまして。midwagonです。 SQLがわからないので教えてください。 A表:id,name B表:id,hiduke これを結合してA表にあるものをすべて表示したいのですが B表のhiduke="20080531" と 日付の制限をかけると何もかえってきません。 どうすればいいのか教えてください。 select A.id,A,name from A left outer join B on A.id=B.id where B.hiduke="20080531";

  • 二つの表の項目を比較して値を取得するSQL

    お世話になります、 二つの表の項目を比較して値を取得するSQLを作成しているのですが、うまくいきません。 具体的には Aテーブル NAME | PRICE ------|------ リンゴ | 100 ------|------ オレンジ | 200 ------|------ ブドウ | 300 ------|------ Bテーブル NAME | PRICE ------|------ リンゴ | 1000 ------|------ オレンジ | 200 ------|------ ブドウ | 1300 ------|------ という二つのテーブルA、Bがあったとします。 このA,Bの二つのテーブルのそれぞれの果物のPRAICEを比較してBのPRICEがアップしている果物を出力するという SQLを教えてください。 <ほしい結果> NAME | PRICE ------|------ リンゴ | 1000 ------|------ ブドウ | 1300 よろしくお願いします。

  • 表Aから表Bへのレコード追加 VB2005 SQLServer2005

    表Aに表Bのデータを追加したいのですが。 例えば、以下のようなテーブルがあったとして。 表A (A,B,C,Dとは項目名のこと) A B C D 表B A B C D E F G 表Aに表Bの項目A,B,C,Dのレコードが追加されればいいのですが。 現在は、コードの中にInsert文を書いてレコードの追加をやっているのですが。 テーブルの項目がたくさんある場合に困っています。 Accessだと追加クエリとかで簡単にできると聞いたのですが。 VB2005では簡単に表の追加はないでしょうか? アドバイスなどがいただけたら幸いです。 開発環境 SQL Server 2005 Express Visual Studio 2005 Pro WindowsXP Pro

  • SQL初心者のため、初歩的な質問だと思いますが、回答お願いします。

    SQL初心者のため、初歩的な質問だと思いますが、回答お願いします。 ●健康診断テーブル ID 回数 結果 ――――――― A  1  11 B  1  22 B  2  23 C  1  11 C  2  22 C  3  12 D  1  12 E  1  31 ●個人情報テーブル ID 所属  ――――― A  経理  B  総務  C  営業  D  営業 E  経理 上のような二つのテーブルがあります。 IDは人物の識別に使うIDで、同じIDなら同じ人を表しています。 健康診断テーブルの結果は、回数を重ねると変わってしまうこともあります。 この二つのテーブルから、所属ごとの結果を表示したいです。 上記の場合、以下のようなデータを出力できるようにしたいです。 所属 結果 人数 ――――――――― 経理 11  1 経理 31  1 総務 23  1 営業 12  2 どのようにプログラムを組めばいいのでしょうか。 グーグル等で検索しても、自分の理解できる解答は見つかりませんでした。 (自分のプログラムレベルがかなり酷く、わからないがわからないのレベルです) 今は初回・2回・3回と回数を変更するSQL文は作成できています。 すいませんが、回答お願いします。

  • 複数の表の外部結合について

    Oracle8iを使用して複数の表から特定のデータを抽出するSQL文を作っています。 【表A】 KaiinID | Name ----------------- 11111 | aaaaa ----------------- 22222 | bbbbb ----------------- 44444 | ddddd ----------------- 55555 | eeeee ----------------- 【表B】 KaiinID | Address ------------------- 11111 | address1 ------------------- 44444 | address4 ------------------- 66666 | address6 ------------------- 77777 | address7 ------------------- 【表C】 KaiinID | Memo ----------------- 11111 | Memo1 ----------------- 22222 | Memo2 ----------------- 33333 | Memo3 ----------------- 66666 | Memo6 ----------------- 【欲しい結果】 KaiinID -------- 44444 『A,B,Cの表のうちCのみに存在しないKaiinID』を検索するSQL文を実行したところ、以下のエラーが表示されてしまいました。 Select A.KaiinID From A,B,C Where A.KaiinID=B.KaiinID and A.KaiinID=C.KaiinID(+) and B.KaiinID=C.KaiinID(+); 「3行でエラーが発生しました。  ORA-01417:表が少なくとも1つの他の表に外部結合されている可能性があります。」 このエラーを見ても「外部結合されている可能性?確かにしてるけど・・・」 としかわかりません。 Select A.KaiinID From A,B Where A.KaiinID=B.KaiinID and A.KaiinID not in (Select KaiinID From C); ともしてみたのですが、こちらは実行した途端SQL*Plusが応答なしになってしまいました。 (実際の表にはA,B,Cそれぞれ300万件近いデータがあります) どのようにすれば、『3つの表のうち1つの表のみに存在しないKaiinID』を取得できるのでしょうか? 御存知の方、教えてください!