アプリ版:「スタンプのみでお礼する」機能のリリースについて

問題:NATION表とINVENTION表より人口密度(人口/面積)が100以下の国で、発明事項がある国の国コードを表示する。

方法1:主問合せでNATION表を利用する 方がうまくいきません。
私の考えた下記SQL文では実行結果が80件返ってしまいます。
答えは方法2と同じ5件ですがどこが悪いのでしょうか?
回答のほどよろしくお願い致します。

方法1:主問合せでNATION表を利用する
SELECT CODE FROM NATION WHERE (POPULATION / AREA) <=ANY(SELECT 100 FROM INVENTION)

SELECT CODE FROM NATION WHERE POPULATION / AREA < 100;(上と同じ意味)
INVENTION表の副問合せがうまくできていないので5件出力できない?

方法2:主問合せでINVENTION表を利用する
SELECT DISTINCT NATION_CODE FROM INVENTION
WHERE NATION_CODE = ANY(SELECT CODE FROM NATION WHERE 100 >= POPULATION / AREA)

NATION_CODE
-----------
107
136
142
154
157

各表の構造はこのようになります。

SQL> DESCRIBE INVENTION
名前 NULL? 型
----------------------------------------- -------- ----------------------------
INVENTION NOT NULL VARCHAR2(30)
INVENTOR VARCHAR2(30)
YEAR NUMBER(4)
NATION_CODE NUMBER(4)

SQL> DESCRIBE NATION
名前 NULL? 型
----------------------------------------- -------- ----------------------------
CODE NOT NULL NUMBER(5)
NATION NOT NULL VARCHAR2(28)
CAPITAL VARCHAR2(20)
AREA NUMBER(22)
POPULATION NUMBER(22)

A 回答 (2件)

前回も書きましたが・・・



SELECT CODE FROM NATION WHERE (POPULATION / AREA) <=ANY(SELECT 100 FROM INVENTION);

と書くのは、

SELECT CODE FROM NATION WHERE POPULATION / AREA < 100;

に等しく、実質的にINVENTION表に関係のない問い合わせをしている。

あなたの書いた説明に当てはめると、「人口密度(人口/面積)が100以下の国」を
問い合わせしていることになり、当然、「発明事項がある国」を抽出しないので
正しい問い合わせになる訳がない。

ということなのでは?
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
おかげでよく分かりました。

お礼日時:2005/07/18 06:29

なんとしても、メンバーシップ検査を使うなら..



SELECT CODE FROM NATION
WHERE
(POPULATION / AREA) <= 100 AND
CODE IN (SELECT NATION_CODE FROM INVENTION)

な感じで書く。

この回答への補足

回答ありがとうございます。
SELECT CODE FROM NATION WHERE (POPULATION / AREA) <=ANY(SELECT 100 FROM INVENTION)
の記述でなぜ正しい結果が返ってこないかが分かりません。

回答のほどよろしくお願いいたします。

補足日時:2005/07/17 20:52
    • good
    • 0

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