• ベストアンサー

2つのテーブルからレコードを抽出する方法

お世話になります。MySQLに関する質問です。 TABLE1とTABLE2の2つのテーブルからレコードを抽出する際、 TABLE1からは全項目のデータを取得し、TABLE2からは一部の項目の データを取得したいと考えています。 条件は、TABLE1とTABLE2を[No]という項目の値で紐(ひも)づけます。 (1) SELECT * FROM TABLE1 (2) SELECT COL_A, COL_B, COL_C FROM TABLE2 上記(1)(2)のレコードを1つのSQLで取得する方法について、どなたかご教授願えますか?

  • MySQL
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

TABLE1とTABLE2の補完関係がわからないので答えがブレそうですね 条件 ・TABLE1とTABLE2のNoは常にユニークで、それぞれのテーブルに1対1でデータをもつ ということであれば、FROM TABLE1,TABLE2で処理します ・TABLE1を主に、TABLE2は不足データがあり、TABLE2のデータあるなしを 関係なくTABLE1の全件を取得するなら FROM TABLE1 LEFT JOIN TABLE2 ON TABLE1.No=TABLE2.No とすることになるでしょう。

masy0312
質問者

お礼

ありがとうございます。 教えていただいた方法で問題解決しました。

その他の回答 (1)

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 select a.*,b.COL_A,b.COL_A,b.COL_B,b.COL_C from TABLE1 a, TABLE2 b where a.NO=b.NO ではないでしょうか。

masy0312
質問者

お礼

ありがとうございます。 教えていただいた方法で問題解決しました。

関連するQ&A

  • <SQL>条件付きで最小値レコードを抽出する方法

    SQLite3.7.5を使っています。 以下<抽出前>の様なテーブルから、col2の値が"FALSE"で(col1=3,4,5の3つ)かつ、col3が最小値(col3=3)であるレコードを<抽出後>のように抽出するSQL文をご教示ください。 <抽出前> col1 | col2 | col3 1 | true | 3 2 | true | 0 3 |false | 3 4 |false | 5 5 |false | 3 <抽出後> col1 | col2 | col3 3 |false | 3 5 |false | 3 自分で考えたSQL文は以下です。 抽出結果は問題ないのですが、同じSELECT文を2回書いていてだいぶ効率悪いことをしているのではないかと思い質問しました。 よろしくお願い致します。 SELECT * FROM (SELECT * FROM test WHERE (col2 = false)) WHERE col3 = (SELECT min(col3) FROM (SELECT * FROM test WHERE (col2 = false)))

  • LIKEを使用したレコード抽出について

    OracleでLIKEを使用したレコード抽出で困っています。 あるテーブル(TAB_A)が以下のような属性だとします。 ------------- COL1 CHAR(5) COL2 CHAR(5) このとき、このテーブルに次のようにデータが格納されています。 COL1  COL2 -------------- ABC==  12345 [=]は便宜上1バイトスペースを表す このテーブルを対象として (1) SELECT * FROM TAB_A WHERE COL1 LIKE 'ABC%'; (2) SELECT * FROM TAB_A WHERE COL1 LIKE 'ABC==';   ([=]は便宜上1バイトスペースを表す) (3) SELECT * FROM TAB_A WHERE COL1 LIKE 'ABC'; というSQLを発行した場合に、いずれもレコードが抽出されてしまいます。(1)(2)の場合は当然だとは思うのですが、(3)でもレコードが抽出されることが理解できません。このようなことが起こり得るのでしょうか。

  • 複数レコードを横並び1レコードで抽出する方法

    ORACLE10gを使用しています。 似た内容の質問があったので QNo.1828920:検索対象のデータが「複数レコード」を「1レコード」として獲得するSQL も見てみたのですが、実際には他にも抽出条件や抽出項目が多いので、 できればGROUP BYは使いたくないと思い、質問させていただきます。 ・TABLE)イメージ CD|NO|NM 10 | 0 | あ 10 | 1 | い 10 | 2 | う 10 | 3 | え ・前提 画面でCD:10およびNO:0~NO:2と範囲指定します。 ・求める結果 下記のように範囲指定したNO分、NMを横並びに抽出したいです。 10,あ,い,う ・考えた内容 VBを使用しているのでプログラム中で動的に抽出項目、FROM句、WHERE句を 追加しようと考えました。 TABLE.NOは2桁なので最大指定で0~99になる可能性があります。その場合FROM句のTABLE別名が99個に なってしまいますが、書き方として問題ないのか不安です。 何かアドバイスがありましたらお願いします。 ・SQL案 SELECT TABLE0.CD, For I = 0 To 2 TABLE & I.NM AS NM & I, Next K FROM For J = 0 To 2 TABLE TABLE & I, Next K WHERE TABLE0.CD = 10 AND For K = 0 To 2 TABLE & K.NO = K AND Next K

  • 別テーブルからselectした値を他のテーブルにinsertしたいのですが、上手くできません

    以下のように行ったのですが、 全ての値が別テーブルにinsertされません。 $sql = "SELECT tbl_A.id, tbl_A.data FROM tbl_A "; $rst = mysql_query( $sql ); while ( $col = mysql_fetch_array( $rst ) ) { $sql = "INSERT INTO tbl_B (          date, id, data ) VALUES ( '" . date( 'Y-m-d' ) . "', '" . mysql_real_escape_string( $col['id'] ) . "', '" . mysql_real_escape_string( $col['data'] ) . "' )"; } このやり方では、テーブル内の1つの値しかinsertされません。 selectされた全ての値をinsertするにはどのようにしたら良いのでしょうか? よろしくお願いします。 DB:mysql5 SP:php5

    • ベストアンサー
    • MySQL
  • 重複していないレコードの抽出方法について

    下記のテーブルの中で、 no1 フィールドが重複していない列(この場合ですが、200003のみ)を抽出したいのですが、どのような sql 文を書けば良いか分かりませんでした。 その為、このような場合、どのような sql 文を書けば良いかご存知の方がいらっしゃいましたら、 ご教示の程、よろしくお願いします。 【w_tblテーブル】 ―――――――――― |key| no1 |no2| ―――――――――― |1 |200001|1 | |2 |200002|1 | |3 |200001|2 | |4 |200002|2 | |5 |200001|3 | |6 |200003|2 | ―――――――――― 【SQL文】 SELECT `no1` FROM `w_tbl` 【結果】 200001 200001 200001 200002 200002 200003 【SQL文】 SELECT DISTINCT `no1` FROM `w_tbl` 【結果】 200001 200002 200003 【SQL文】 ※※※ここの書き方が分かりません。※※※ 【結果】 200003 以上、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • DBで指定した値しか存在しないデータを抽出する方法

    指定した second_no しか存在しない no を抽出したいのですが、 どのように SQL 文を記述すればよいか分からなかったので、 記述方法についてアドバイスいただける方がいらっしゃいましたら、 ご教示の程、よろしくお願いします。 [test_table]テーブル ――――――――― id|no|second_no ――――――――― 1 |11|01 2 |11|03 3 |11|05 4 |12|05 5 |13|00 6 |13|05 7 |14|00 8 |14|05 ――――――――― 【やりたい事1】 下記のように second_no が 00 と 05 のものを抽出すると、no = 11, 12, 13, 13, 14, 14 が抽出されます。 SELECT * FROM test_table WHERE second_no = '00' OR second_no = '05' これを no = 13, 14が抽出され、no = 11, 12 は抽出されないようにしたいです (no = 11 は、second_no に 01 という 00, 05 以外の値が存在する為です。 no = 12 は second_no に 00 が存在しない為です)。 その為、下記の方法で出来ないかと考えました。 1. 全件取得 2. 部分取得 3. 全件取得で獲得した no と部分取得で獲得した no の個数が一致したものが今回取得したいもの。 上記の考え方をソースにしたものは下記となりますが、 この考え方では、no = 12 が抽出されてしまうため、 考え方を変える必要があるのですが、どうすればよいか分かりませんでした。 なお、抽出したい second_no は 00 で抽出したいときもあれば、 00 と 05 で抽出したいときなど複数のパターンがあります。 それと、下記のソースの「データベースユーザ名」「データベースパスワード名」 「データベース名」はそれぞれの環境に合わせる必要があります。 【ソース】 <?php $link = mysql_connect('localhost', 'データベースユーザ名', 'データベースパスワード名'); mysql_select_db('データベース名', $link); // 1.全件取得 $query = mysql_query("SELECT * FROM test_table", $link); while ($row = mysql_fetch_array($query)) { // echo $row["no"]; // echo "<br>"; } //echo "<br>"; // 2.部分一致。 $query = mysql_query("SELECT * FROM test_table WHERE second_no = '00' or second_no = '05'", $link); while ($row = mysql_fetch_array($query)) { // echo $row["no"]; // echo "<br>"; } // 3.ここで1と2の結果を参考に、noが13と14を抽出したい。 mysql_close($link); ?> 【やりたい事2】 上記のソースは複数の SQL 文で実現しようとしていますが、 1つの SQL 文でこのような動作を実現する事は出来ないでしょうか? 以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • SQlを使用して指定レコードの削除を行いたい

    SQL構文を使用して、テーブル内の指定のデータを削除したいと思っています (oracle11gです) 条件抽出テーブル:PRM_A 抽出条件1の対象カラム:NO_1(6ケタで年月が入っている) 抽出条件2の対象カラム:NO_2(0か1が入っている) 抽出内容:NO_1の年月のうち、最小の値かつ、NO_2の値が0である →抽出結果として、6けたの年月が出力される 削除対象テーブル:DEL_TBL_A 削除条件用カラム1:DEL_COL_1 削除条件用カラム2:DEL_COL_2 削除条件:DEL_COL_1が「抽出結果」の1~4桁目(4桁の数値)と一致し、 DEL_COL_2が「抽出結果」の5~6桁目(2桁の数値)と一致する 以上の処理を行おうとして、まずは前半部分(抽出結果の抜き出しまで)を行いました。 select min(NO_1) from PRM_A where NO_2=0 上記で、想定できる結果の出力ができました。 その次に、削除条件を作成しようとしたのですが、下記の記載で実施したところ、 Error [row:3,col:130] ORA-00936: 式がありません。 と出力されました。 select substr((select min(NO_1) from PRM_A ),1,4) from PRM_A where NO_2=0 and (select min(NO_1) from PRM_A) ; 申し訳ございませんが、理由と正しいSQL文がお分かりになられる方がおりましたら、ご教授願えませんでしょうか

  • 複数のテーブルのレコードをカウントする方法

    2つのテーブルのレコード数をカウントする方法を教えてください。 $sql = "SELECT * FROM テーブル1 and テーブル2"; $res = mysql_query($sql,$myLink); $num_k = mysql_num_rows($res); こんな感じでカウントできるかと思ったのですが出来ませんでした。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • レコードの抽出

    PerlCGIでSQL-ENGINE.plというライブラリを使ってSQLを実行しています。最も結構ローカルなフリーのライブラリだから(作った人におこられるか)それの使い方を教えてくださいという訳ではありません。 一般的な形で結構ですので、SQL文を教えてもらいたいのです。 例えば select * from テーブル where 抽出条件 order by 何かの基準で降順並替え; として、さらにこの抽出結果の上から11番目のレコードから20番目のレコードだけを抽出したいとすると、これにどのようなSQL文を追加したらよいのでしょう。

  • 重複レコードの取得

    すみません。。重複レコードの取得方法に困っています。 やりたいのは以下です。 テーブルA 項目1| 項目2| 項目3| 11 | 11 | 01 | 12 | 11 | 02 | 13 | 11 | 04 | 14 | 11 | 04 | 上記の項目1は主キーです。 抽出したいのは下記のみです。 項目1| 項目2| 項目3| 13 | 11 | 04 | 14 | 11 | 04 | 色々SQLを組んで試しては見てるのですが。。。。 select * from テーブル where ((項目3) in (SELECT 項目3 FROM テーブル GROUP BY 項目3 having count(*)>1)) 上記SQLだと項目3を主キーごとにカウントしてるみたいなので 意図した結果が抽出されないのです・・・・・。 項目2と項目3を結合して重複のチェックをすればよいのか?? とも思いますがSQL自体が1本で完結したいので よく分からなくなってしまいました。。。。。 皆さんご教示宜しくお願い致します。