※ ChatGPTを利用し、要約された質問です(原文:副問合せ 続(Oracle SQL))
副問合せ 続(Oracle SQL)
2005/07/17 13:12
このQ&Aのポイント
NATION表とINVENTION表から人口密度が100以下で、発明事項がある国の国コードを取得する方法についての質問です。
方法1では予想外の結果が返ってしまい、どこが間違っているのかがわからないため、答えを教えて欲しいという相談です。
方法2では正しく5件の結果が取得できていますが、なぜ方法1がうまくいかないのかが気になっています。
問題: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)
質問の原文を閉じる
質問の原文を表示する
補足
回答ありがとうございます。 SELECT CODE FROM NATION WHERE (POPULATION / AREA) <=ANY(SELECT 100 FROM INVENTION) の記述でなぜ正しい結果が返ってこないかが分かりません。 回答のほどよろしくお願いいたします。