2つのテーブルから条件に一致しないデータ抽出

このQ&Aのポイント
  • 2つのテーブルから条件に一致しない行のみ抜き出しCSVか他のテーブルに抜き出す処理を作ろうと思っています。
  • マスターテーブルの店コードが店コードテーブルに存在しないデータのみ抽出するSQL文をお探しですね。
  • SELECT * FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S ON M.店コード = S.店コード
回答を見る
  • ベストアンサー

2つのテーブルから条件に一致しないデータ抽出

2つのテーブルから条件に一致しない行のみ抜き出しCSV か他のテーブルに抜き出す処理を作ろうと思っています。 そこで質問なのですが、以下の2つのテーブルから 条件に一致しないコードのみ抜き出すSQL文などありますか? ----------------------------------------- マスターテーブル コード、ネーム1、ネーム2、店コード 1、あ、い、6 2、う、え、8 3、お、か、4 4、き、く、2 店コードテーブル 店コード、店区分 1、スーパー 2、コンビニ 3、デパート 4、ホームセンター ------------------------------------------ 条件は、マスターテーブルの店コードが店コードテーブルに存在 しないデータのみ抽出です。 抽出結果は、以下の様にしたいです。 1、あ、い、6 2、う、え、8 このような考え大丈夫でしょうか? SELECT * FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S ON M.店コード = S.店コード わかりずらい質問ですがよろしくお願いします。

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

  • ベストアンサー
回答No.2

このような考え大丈夫でしょうか? SELECT * FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S ON M.店コード = S.店コード 店コードが一致するレコードを抽出しているのですね。 はい、大丈夫です。 もっとも単純に、分かりやすい式を書くのであれば この条件否定なので left outer join で結合して、結合できなかったデータ、 つまり、店がNullのデータを取れば抽出できます。 SELECT * FROM マスターテーブル AS M left outer join 店コードテーブル AS S ON M.店コード = S.店コード where S.店コード is null または、 SELECT * FROM マスターテーブル as M where M.店コード not in ( select 店コード from 店コードテーブル) 等でいけるでしょう。 ただ、参考URLにもありますように、 is null とか not in は遅いです。(Indexで見れなくなるので) 大量データを扱うような場合や、速度が求められるような場合は 別途クエリを検討しましょう。

参考URL:
http://www.geocities.jp/mickindex/database/db_optimize.html
tiebukuro1
質問者

お礼

ありがとうございます。nullを検索すればよかったんですね。

その他の回答 (1)

  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.1

>SELECT * >FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S >ON M.店コード = S.店コード 上記のようにINNER JOINしてしまうと、両テーブルに存在する店コードの行のみ選択されます。 外部結合を行って、マスターテーブルの全行を戻し、WHERE句で店コードテーブル側に存在しない(IS NULLを指定)行を選択します。 または、以下のように「not in」「not exists」を使う方法もあります。 select M.* from マスターテーブル AS M where M.店コード not in (select 店コード from 店コードテーブル AS S); select M.* from マスターテーブル AS M where not exists (select 店コード from 店コードテーブル AS S WHERE M.店コード = S.店コード);

tiebukuro1
質問者

お礼

ありがとうございます。not inを使ってみます。

関連するQ&A

  • 3つのテーブルから条件に一致しない行のみ抜き出し

    すいませんこの間、 2つのテーブルから条件に一致しない行のみ抜き出す 方法について質問した者です。 今回は、3つのテーブルから条件に一致しない行のみ抜き出しCSV か他のテーブルに抜き出す処理を作ろうと思っています。 そこで質問なのですが、以下の2つのテーブルから 条件に一致しないコードのみ抜き出すSQL文などありますか? ----------------------------------------- マスターテーブル コード、ネーム1、ネーム2、店コード、店地域 1、あ、い、6、東京 2、う、え、8、北海道 3、お、か、4、京都 4、き、く、2、奈良 店コードテーブル 店コード、店区分 1、スーパー 2、コンビニ 3、デパート 4、ホームセンター 地域テーブル 地域コード、店地域 1、東京 2、京都 ------------------------------------------ 条件は、マスターテーブルの店コードが店コードテーブルに存在 しないANDマスターテーブルの店地域が地域テーブルに存在 しないデータのみ抽出です。 抽出結果は、以下の様にしたいです。 1、あ、い、6、東京 2、う、え、8、北海道 4、き、く、2、奈良 わかりずらい質問ですがよろしくお願いします。

  • Access 意図しないパラメータ入力

    クエリを作成中なのですが、意図しないパラメータ入力ボックスが表示されます。 テーブルでは店マスタを一側 それ以外の項目が多側になっています。 エクセル用に横並びにするため多側を抽出条件で各項目ごとにクエリを作成しました。 これを一まとめのクエリにしようとしましたが項目が10以上あり クエリが複雑すぎる、ということで二つに分けようとしたのですが 二つ目のクエリでなぜかパラメータ入力が表示されます。 抽出条件は指定していません。 なぜこのようなことになるのでしょうか? 店マスタはテーブルのものを使用。 ゴルフ、球技ボール・・・は多テーブルから各条件を指定し抽出したクエリ。 SELECT ■店マスタ.店コード, ゴルフ.*, 球技ボール.*, 釣.*, 登山・アウトドア.*, 海・水中.*, 武道.*, その他.*, 合計.* FROM (((((((■店マスタ INNER JOIN ゴルフ ON ■店マスタ.店コード = ゴルフ.店コード) INNER JOIN 球技ボール ON ■店マスタ.店コード = 球技ボール.店コード) INNER JOIN 釣 ON ■店マスタ.店コード = 釣.店コード) INNER JOIN 登山・アウトドア ON ■店マスタ.店コード = 登山・アウトドア.店コード) INNER JOIN 海・水中 ON ■店マスタ.店コード = 海・水中.店コード) INNER JOIN 武道 ON ■店マスタ.店コード = 武道.店コード) INNER JOIN その他 ON ■店マスタ.店コード = その他.店コード) INNER JOIN 合計 ON ■店マスタ.店コード = 合計.店コード;

  • left outer joinで抽出したい

    SELECT (TABLE1 INNER JOIN TABLE2 ON TABLE1.CODE = TABLE2.CODE) INNER JOIN TABLE3 ON TABLE1.JAN = TABLE3.JAN というSQL文があります。この文を変更して下記の条件での抽出をおこないたいと思います。 ■TABLE1.JANを元にする。 ■TABLE1.JAN = TABLE3.JANは抽出に含めない ■TABLE1.JANに存在していて、TABLE3.JANに存在しないJANをTABLE1.JANから抽出 このようなSQL文をかきたいのですが、どのようなSQL文にしたらよいでしょうか? left outer joinを使えばいいとは思うのですが、そこから先が思い浮かびません。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • テーブル結合について

    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の設定がおかしいのか、さっぱり見当がつきません。 足りない情報がありましたら補足いたしますので、どうぞよろしくお願いします。

  • ACCESS 選択クエリでの抽出条件について

    在庫マスターと得意先マスターのテーブルを使用して 在庫マスターのデータを抽出条件により出力したいと思っています。 在庫マスターは区分コード1の倉庫コードと区分コード3の店舗コードと分かれており、 抽出条件は区分コード1の時は倉庫コード199と155は除きます。 区分コード2の時は得意先マスターの形態コードから"1"と"2"のものを抽出します。 デザインビューでクエリ作成するで選択クエリから抽出条件を入力してデータを出力できないのでしょうか。 色々と試していますがエラーが表示され出力できません。 例) If([ST_WHTYPE]="1",([dbo_STOCK].[ST_WHNO]) Not In ("199","155"), IIf([ST_WHTYPE]="3",[CU_SHOPTYPE]="1" Or [CU_SHOPTYPE]="2")) この場合は集計関数・・・・・含んでないクエリーを実行しましたと表示されます。 他には複雑すぎるため評価できませんとかエラーが表示されます。 選択クエリでの抽出条件ではできないのでしょうか。

  • ASPでmdbファイルからデータの抽出(SQL)

    ASPでmdbファイルからデータを抽出したいのですが、うまくいきません。 TABLE1に以下のレコードがあるとします(MS-ACCESS) ID,RANK1,RANK2(TABLE1) 1,1,1 2,1,2 3,1,3 4,2,1 5,2,2 6,2,3 RANK1、RANK2は以下のテーブルを参照し RANK,RANK_NAME(TABLE2) 1,上 2,中 2,下 このように表示させたいのです。 1,上,上 2,上,中 3,上,下 4,中,上 5,中,中 6,中,下 しかし、ACCESSのクエリーでは動作するのですが、ASPでは上中下が表示されません。 以下ASPで記述したSQL文です SELECT TABLE1.ID, RANK1.RANK_NAME, RANK2.RANK_NAME FROM (TABLE1 INNER JOIN TABLE2 AS RANK1 ON TABLE1.RANK1 = RANK1.RANK) INNER JOIN TABLE2 AS RANK2 ON TABLE1.RANK2 = RANK2.RANK; 何か悪いのでしょうか? 宜しくお願いいたします。

  • 3つのテーブルからのデータ抽出

    こんにちは。お世話になっております。 http://oshiete1.goo.ne.jp/qa3421595.html 以前、上記箇所にて似たような質問をさせていただきましたが、同じテーブルを用い、違う検索結果を出そうとしたところ、思うような結果を得られずに居る次第です。 今日も一日中試行錯誤を繰り返しているのですが、どうにも描いている結果を得ることが出来ません。お忙しい中恐縮ですが、お知恵を頂戴出来れば幸いです。(MySQL 4.1) 前回の質問は・・・ memberテーブル id  n_name 1  大輔 2  雅彦 3  順子 4  幸子 5  明美 6  二郎 friendテーブル(id、f_idは、memberテーブルのidを指す。) no id f_id 1  3  5 2  5  3 3  3  1 4  1  3 5  3  6 6  6  3 diaryテーブル(idはmemberテーブルのidを指す。memberのidに該当する人の発言データ) no id  date  subject 1  3   //  今日は寒いね 2  5   //  美味しそう 3  2   //  疲れたな 4  2   //  頑張ろう 5  1   //  楽しいぞ 6  6   //  晴れるといいな ※dateは省略しています。 以上、例えばmemberテーブルにおいて、id(下記SQLでは$tb_idとしています)が3の順子を検索した際、 friendテーブルを参照し、idカラムが3の相手であるf_idを見つけ、更にそのf_idを基にmemberテーブル内のn_name、 かつdiaryテーブル内の、date、subjectを下記のように一覧表示させたいという質問でした。 二郎 晴れるといいな 大輔 楽しいぞ 明美 美味しそう と、ここで、 二郎 晴れるといいな 大輔 楽しいぞ 明美 美味しそう 順子 今日は寒いね 以上のように自分の発言を表示させようと、したところ現在、 二郎 晴れるといいな 大輔 楽しいぞ 明美 美味しそう 順子 今日は寒いね 順子 今日は寒いね と、自分の発言が2度出てきてしまう状態です。 ちなみにSQL文は、 $sql = "select c.subject,m2.n_name,c.date,c.no,f.f_id,f.id from member as m inner join friend as f on m.id=f.id inner join diary as c on f.f_id=c.id inner join member as m2 on m2.id=c.id WHERE ((f.id=$tb_id OR f.f_id=$tb_id) AND f.id!=f.f_id) order by no desc LIMIT 0, 30;"; ここ数日、色々調べており、特に昨夜からは(今日も一日中。汗)ずっと試行錯誤を繰り返しているのですが、思い描く結果を得ることが 出来ない状態です。 お忙しい中恐縮では御座いますが、アドバイスのほど宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • 不一致クエリでnullまで抽出されてしまいます

    質問です。 現在、accessにて不一致クエリを使用し、テーブルAをチェックし、 マスタテーブルに無い情報が書かれてしまっているフィールドがある場合 抽出して確認をする、というクエリを作りたいと考えています。 不一致クエリにて自動で入る「is null」を使用すると マスタテーブルに無い事が書いてあるレコードは抽出するのですが (逆になぜis nullで相違するレコードが抽出されるのか理解に苦しんでもいるのですが) is nullですので、nullのレコードも抽出されてしまいます。 抽出条件として、マスタテーブルと相違するもの&nullは抽出しない、としたいのですがお知恵を拝借出来ませんでしょうか。 よろしくお願いいたします。

  • MySQLでテーブル一致条件に正規表現は使用可能?

    ・MySQLで一致条件に正規表現を使用することは出来ますか? ・もし出来るとすればどのようにすれば良いでしょうか? ■やりたいこと ・aテーブルのurlカラム内容が「/color/★★」だったら「/color/」以下の★★を抽出して、bテーブルのidと一致したレコードを抽出したい ・aテーブルの★★と、bテーブルのidカラムが一致しているレコードが欲しい ・aテーブルのurlカラムには「/color/58」「/color/26」「/hoge/■■」などが入っています SELECT *     FROM a      LEFT JOIN a.url = b.id     REGEXP '^(/color)'?     where a.★★ = b.id

    • ベストアンサー
    • MySQL
  • 3つのテーブルから、データが重複しないように抽出したい

    お世話になっております。 今回、以下のような3つのテーブルから情報を引き出したいのですが、 うまくいかず困っております。 【TABLE_A】  a_no | animal_name | ------+------------+  0001 |   uma   |  0002 |   usagi   |  0003 |   kirin   | 【TABLE_B】  b_no | fish_name | ------+----------+  000A | ayu     |  000B | suzuki    |  000C | kurodai   | 【TABLE_C】  NO | a_no1 | a_no2 | b_no1 | b_no2 | ----+-------+-------+-------+-------+  1 |  0001 | 0003  | null  | 000A  |  2 |  0002 | null   | 000C | 000B  |  3 |  0001 | 0002  | null  | null   | TABLE_Cをベースに、A、Bのテーブルから該当データのname値を取ってきたいのですがうまくいきません。 私が求める結果は以下のような感じです。(条件:WHERE NO = 1)  NO | a_no | animal_name | b_no | fish_name | -----+------+------------+------+----------+  1  | 0001 |   uma    | null   |  null   |  1  | 0003 |   kirin    | 000A  |  ayu   | 下記のように、INNER JOIN句を使ったりして四苦八苦してみたのですが、いまいち上手く抽出できません。 SELECT c.NO, a.a_no, a.animal_name, b.b_no, b.fish_name FROM (TABLE_C c INNER JOIN TABLE_A a ON c.a_no1 = a.a_no OR c.a_no2 = a.a_no ) INNER JOIN TABLE_B b ON c.b_no1 = b.b_no OR c.b_no2 = b.b_no WHERE c.NO = 1; 上記だと、  NO | a_no | animal_name | b_no | fish_name | ----+-------+------------+------+----------+  1  | 0001 |   uma   | null   |  null  |  1  | 0003 |   kirin   | 000A  |  ayu  |  1  | 0003 |   kirin   | 000A  |  ayu  | のように、余計に重複して結果が返されてきてしまいます。(3行目は2行目と同じ結果なのでいらないのです・・・) 何か良い構文はありませんでしょうか?;; 宜しくお願い致します! (環境は、MySQL 4.1.1です。)

    • ベストアンサー
    • MySQL