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

NATION表とINVENTION表より人口密度(人口/面積)が100以下の国で、発明事項がある国の国コードを表示する。
方法1:主問合せでNATION表を利用する
14件
1 SELECT DISTINCT NATION_CODE FROM INVENTION
2* WHERE 100 >= ANY(SELECT POPULATION / AREA FROM NATION)

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

出力件数が方法1と2で異なるわけですが同じことをしているので(つもり)件数が違う理由が今ひとつわかりません。
よろしくお願いいたします。

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件)

元になるテーブルにあるレコード数が違うから


1国=1発明ではないのでしょう?

この回答への補足

回答ありがとうございます。
ということは主問合せの表を変えると件数が絶対に変わってしまうのでしょうか?
出力件数を同じにする文法があれば教えてほしいのですが。

補足日時:2005/07/13 21:33
    • good
    • 0

INVENTION を主にする場合、同じ国が複数出ていると思うので、国コードでグループ化するといいはず…きっと

この回答への補足

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

方法1失敗!
SELECT CODE FROM NATION WHERE (POPULATION / AREA) <=ANY(SELECT 100 FROM INVENTION)


方法2実行結果成功!
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

補足日時:2005/07/15 21:31
    • good
    • 0

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