10秒目をつむったら…

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.店コード

わかりずらい質問ですがよろしくお願いします。

A 回答 (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_op …
    • good
    • 2
この回答へのお礼

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

お礼日時:2009/06/01 14:09

>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.店コード);
    • good
    • 4
この回答へのお礼

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

お礼日時:2009/06/01 14:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


おすすめ情報

このQ&Aを見た人がよく見るQ&A