こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

SQLでNOT INと!=ALLの違い

現在、仕事で使用する機会がありそうなのでOracleでSQLを勉強しています。
ある教本の練習問題をしていて気になったので質問させてください。

単純な受注に関するデータベースの問題です。
CUSTOMER_TとSLIP_Tというテーブルがあり、
CUSTOMER_Tは顧客コード、顧客の名前、顧客の住所が載っています。
SLIP_Tは受注番号、発注した顧客の顧客コード、受注した日が載っています。
2007年1月10日以降に受注したことのない顧客の名前を出力する問題なのですが私は以下のように解答しました。
SELECT CUST_NAME
FROM CUSTOMER_T
WHERE CUST_CODE != ALL(SELECT CUST_CODE
FROM SLIP_T
WHERE SLIP_DATE >= '2007-1-10');

しかし解答は以下でした。
SELECT CUST_NAME
FROM CUSTOMER_T
WHERE CUST_CODE NOT IN(SELECT CUST_CODE
FROM SLIP_T
WHERE SLIP_DATE >= '2007-1-10');

自分で簡単なデータベースを作り試してみたのですが出力結果は同じになりました。
この二つのSQL文の違いにどのような問題があるのでしょうか?よろしくお願いします。

投稿日時 - 2010-01-13 22:19:14

QNo.5591142

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

マニュアル参照。

http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19201-02/conditions.html#10694

> IN
>メンバーとの等価性をテストします。=ANYと同じです。

> NOT IN
>!=ALLと同じです。メンバーのいずれかがNULLの場合には、FALSEと評価されます。

なので「NOT IN」と「!=ALL」は同じです。
同じなら他の人にもわかりやすい「NOT IN」を使うほうがよいと思います。ALLを使ったSQLは、あまり見たことがありません。

それよりは「not in」と「not exists」の違いを把握しておいた方がよいです。

http://oshiete1.goo.ne.jp/qa5419099.html
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19201-02/conditions.html#10694

投稿日時 - 2010-01-14 11:40:53

あなたにオススメの質問