• ベストアンサー

Aテーブルの条件でBテーブルから抜き出し

すみません。大変困っています。 SQL文で Aテーブル、Bテーブルがありまして、 A.id = B.idがリレーションしています。 Aテーブルから、Bテーブルのidが無いデータだけを 取り出したいのですが、どういった例が考えられますでしょうか?よろしくお願いします。

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

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

  • ベストアンサー
  • togino
  • ベストアンサー率75% (97/129)
回答No.2

サブクエリーを使った例のほかに JOIN 構文を使った方法もあります。 SELECT A.* FROM A LEFT JOIN B ON A.id = B.id WHERE B.id IS NULL; JOIN は通常、両方のテーブルのキーを使って2つのテーブルを結合する構文で、両方にキーが存在しないと結合されませんが、LEFT をつけると左側(この場合A)のテーブルをすべて含む結合(右側にキーが存在しない場合は NULL として扱われる)が行われます。 http://dev.mysql.com/doc/mysql/ja/JOIN.html#IDX1520 の上から3つ目あたりに例が載っています。

参考URL:
http://dev.mysql.com/doc/mysql/ja/JOIN.html#IDX1520

その他の回答 (2)

  • togino
  • ベストアンサー率75% (97/129)
回答No.3

私は普段 PostgreSQL を使っているので MySQL のリファレンスを見ながら回答していますが・・・ MySQL でサブクエリーが使えないってことはないでしょう(汗) > 動きません。 > MySQLでは、サブクエリーだめなんですかね…。。 なんというエラーが出ているのか、教えて欲しいですね。 SELECT * FROM A WHERE id <> ANY (SELECT id FROM B); とかではどうでしょう? サブクエリーを使った例は http://dev.mysql.com/doc/mysql/ja/ANY_IN_SOME_subqueries.html などを参考にしてください。

saruyamamonki
質問者

お礼

返信ありがとうございます。 >SELECT * FROM A WHERE id <> ANY (SELECT id FROM B); ↑こちらを試すために↓SQLを実行したところ SELECT * FROM A WHERE id <> ANY(SELECT id FROM B WHERE date BETWEEN '2004-08-01' AND '2004-09-01') 次のエラーが出ます。 You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax *表題の件の問題は、SQLを二回に分けて、NOT IN で実行し解決しました。 ありがとうございます。

回答No.1

MySQLはあまりよく知らないですが、 サブクエリーが使えれば次のSQL文で取り出せます。 SELECT A.* FROM A WHERE A.ID NOT IN (SELECT B.ID FROM B)

saruyamamonki
質問者

補足

動きません。 MySQLでは、サブクエリーだめなんですかね…。。 ありがとうございます。

関連するQ&A

  • 別のテーブルから数値を取得したい

    リレーションか、結合どちらになるかわからないのですが、 たとえば例をあげると syohin:【商品リスト】と【荷物の大きさ】 souryou:【荷物の大きさ】と【送料】 というテーブルがあるとします。 syohin type ----------- 001 A 002 B 003 C type souryou -------------- A 500 B 1000 C 1500 SQL文で、syohinとsouryouを出力したいのですが、 (例:商品002のみ「商品名」と「送料」を出したい) syohin souryou ---------------- 002 1000 のですが、どのようなSQL文になるのでしょうか? これがリレーションであるならば、テーブルの作成時や、フィールドの作成時に何かしらのオプション設定が必要なのでしょうか?

    • ベストアンサー
    • MySQL
  • 条件付ソートについて

    SQL文で条件付のソートについて教えてください。 テーブルA(id, data_a, data_b)があったとき、 data_aとdata_bのうち、値が大きいほうのデータでソートするためのSQL文が知りたいのです。 例えば以下のようなデータが入っていたとき、 id,date_a,date_b 1, 10, 0 2, 20, 40 3, 30, 30 4, 90, 15 以下のような結果になるようにソートしたいのです。 id,date_a,date_b 1, 10, 0 3, 30, 30 2, 20, 40 4, 90, 15 良い方法があれば教えてください。 よろしくお願いします。

  • テーブルAにあって、テーブルBにないデータ抽出

    このようなデータのテーブルがあります。 テーブルA key ID ----------------- 1 AAAAA 2 BBBBB 3 CCCCC 4 DDDDD 5 EEEEE 6 FFFFF 7 GGGGG 8 HHHHH 9 IIIII テーブルB key ID ----------------- 1 AAAAA 2 CCCCC 3 EEEEE 4 FFFFF 5 HHHHH 6 IIIII 7 JJJJJ 8 KKKKK 9 LLLLL この場合テーブルAのIDの中で、テーブルBのIDには存在しない行を取り出すのに、プログラムを使わずに取得する方法はありますか? この例だと取得するはずの行は key ID ----------------- 2 BBBBB 4 DDDDD 7 GGGGG になります。 どうかよろしくお願いします。

    • ベストアンサー
    • MySQL
  • Accessで BテーブルのフィールドをAフールドに書き換えたい。

    初心者ですが宜しくお願い致します。 Aテーブル →[氏名],[名前] Bテーブル →[氏名],[結婚後氏名] (1)上のようなテーブルがあります。クエリで、AテーブルとBテーブルの[氏名]フィールドをキーにしてリレーションを組み、A,Bテーブルのフィールド全てを表示させます。 (2)(1)で抽出されたデータだけ、Aテーブルの[氏名]フィールドをBテーブルの[結婚後氏名]フィールドに書き換えたいのですが・・・・ なにかよい方法はありますでしょうか。 詳しい方、教えてください。 宜しくお願い致します。

  • insert into select で別テーブルのID分挿入したい

    SQLでこんなことは可能でしょうか。 列 IDとTEXT をもつテーブルA と、 列 IDをもつテーブルBがあります。 テーブルAに、テーブルBのID分のデータを挿入したいです。 TEXTはテーブルAのID=1のTEXTデータを全ての列に挿入します。 このような場合のSQL文を調べてるのですが、 なかなかわからなくて困っています。 insert into select b.id,a.text from tableA as a, tableB as b でもうまくいきませんでした。 何かいい方法はないでしょうか? 回答お待ちしております。

  • SELECT/別テーブルのレコード数も取得したい

    ■環境 ・MySQL ■前提 ・テーブルA … idカラム ・テーブルB … A_idカラム ■やりたいこと ・テーブルAデータを取得する際、テーブルAレコードに応じて、テーブルB「A_idカラム」の数(レコード数)も取得したい ■取得イメージ例 ・テーブルA「全カラム」、「count」カラム ※「count」カラム … テーブルBにある「A_idカラム」の数 ■知りたいこと ・どこにも存在しないこの「count」カラムはどうやって作成したら良いでしょうか? ・全体のSQL文

    • ベストアンサー
    • MySQL
  • テーブルAとBをくっつけてOrderBy

    SQLで テーブルAとテーブルBがあり、 AとBの構造はほぼ同じとします。 Selectで引用する際に、 seelct * from (A + B) みたいなAとBをくっつけて、 あるカラムをOrderByしたいと思っております。 いったんTempテーブルなどに落とし込むなども考えましたが、 スマートではなく、時間もかかることなので、 1クエリで取得することは可能でしょうか?

  • 2つのテーブルAとBをマージして新しいテーブルCを作成したいのです。

    2つのテーブルAとBをマージして新しいテーブルCを作成したいのです。マージするときは、最新の売上日フィールドをもつレコードを取得します。環境はAccess2000です。どんなSQL文を作成すればいいのでしょうか?  また、テーブルAにしかないレコード、又はテーブルBにしかないレコードは、そのままテーブルCに追加したいです。 ※下記テーブルAとBは、Access内に存在します。テーブルCはAとBのマージ後の結果作成されるテーブルです。 テーブルA 顧客番号   売上日   商品名   備考    1  2000-01-01  ふでばこ   A    2  2000-02-02  鉛筆     A    3  2000-03-03  定規     A    4  2000-04-04  シャーペン  A   99  2000-09-09  パソコン   A テーブルB 顧客番号   売上日   商品名   備考    4  2001-04-04  シャーペン  B    2  2000-02-02  鉛筆     B    3  2001-03-03  定規     B    1  1999-01-01  ふでばこ   B  100  2005-11-11  ワープロ   B テーブルAとBを、最新の売上日の条件でレコードを取得し新しいテーブルCを作成する。 テーブルC 顧客番号   売上日   商品名   備考    1  2000-01-01  ふでばこ   A    2  2000-02-02  鉛筆     A    3  2001-03-03  定規     B    4  2000-04-04  シャーペン  A   99  2000-09-09  パソコン   A  100  2005-11-11  ワープロ   B SQL文で処理可能なのでしょうか?

  • テーブルデータの絞込み条件

    MySQL4.1、PHP Version 4.3.9を使用しています。 下記のような2つのテーブルA,Bから テーブルAに存在するキー(no)のデータのみ取得したいのですが、 どのようにWHERE文を書いたら一回のSQL文で取得出来るのでしょうか。 テーブルA no |name 1 |たろう 2 |はなこ 3 |じろう テーブルB no |old 1 |16 3 |18 取得したい結果テーブル no |name 2 |はなこ 良い方法が見つかりません。 宜しくお願いします。

  • 2つのテーブル結合

    Oracle10g使用しています。 テーブルAとテーブルBを結合させてデータを取得したいと思っています。 [テーブルA] ID name 1 A 2 B 3 C 4 D [テーブルB] ID SEQ VALUE 1 1 111 2 1 222 2 2 333 3 1 444 4 1 555 4 2 666 4 3 777 テーブルAのキーは[ID]、テーブルBのキーは[ID,SEQ]です。 この二つを連結して以下のように出力したいと思っています。 ID SEQ NAME VALUE 1 1 A 111 2 2 B 333 3 1 C 444 4 3 D 777 テーブルBのデータは同じIDのうち最大のSEQのものを取得したいのですが よいSQLが思いつきません。 よい方法があればご教授ください。 よろしくお願いいたします。