dポイントプレゼントキャンペーン実施中!

現在、仕事で使用する機会がありそうなので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文の違いにどのような問題があるのでしょうか?よろしくお願いします。

A 回答 (1件)

マニュアル参照。



http://otndnld.oracle.co.jp/document/products/or …

> 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/or …
    • good
    • 0

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

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