• ベストアンサー
  • 暇なときにでも

副問合せ

問題:NATION表とINVENTION表より人口密度(人口/面積)が100以下の国で、発明事項がある国の国コードを表示する。 方法1:主問合せでNATION表を利用する 方がうまくいきません。 私の考えた下記SQL文では実行結果が80件返ってしまいます。 答えは方法2と同じ5件ですがどこが悪いのでしょうか? 回答のほどよろしくお願い致します。 方法1:主問合せでNATION表を利用する SELECT CODE FROM NATION WHERE (POPULATION / AREA) <=ANY(SELECT 100 FROM INVENTION) 方法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

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数189
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.2

方法はいくつもあると思いますが.. select CODE from NATION where (POPULATION / AREA) <= 100 and exists(select 1 from INVENTION where NATION_CODE=CODE) とか select CODE from NATION,INVENTION where (POPULATION / AREA) <= 100 and NATION_CODE=CODE が妥当なんじゃないでしょうか。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

「副問合せ 続(Oracle SQL)」 で的確な結果の出力が返ってきたので、とりあえずOKです。 本当にありがとうございました。

関連するQ&A

  • 副問合せについて

    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)

  • 副問合せ 続(Oracle SQL)

    問題: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)

  • グループ関数のエラーについて

    下記SQLを実行するとエラーが返ってきます。 構文は合っていると思うのですが何故でしょうか。 1 select nation 2 from nation 3 group by nation 4* having area > avg(area) SQL> / having area > avg(area) * 行4でエラーが発生しました。: ORA-00979: GROUP BYの式ではありません。 副問合せをするとうまくいきました。 1 select nation 2 from nation 3* where area >(select avg(area) from nation) どちらの方法も同じ考え方だと思うのですが、上のやり方でエラーが出る理由を教えてほしいです。 回答のほどよろしくお願い致します。 SQL> desc nation; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- CODE NOT NULL NUMBER(5) NATION NOT NULL VARCHAR2(28) CAPITAL VARCHAR2(20) AREA NUMBER(22) POPULATION NUMBER(22)

その他の回答 (1)

  • 回答No.1

各表の説明がないので、正しいSQLは、どのように書けばよいのか 判りませんが・・ 少なくとも、方法1のSQLは、副問い合わせが、定数100を返すので、 副問い合わせの意味は全くなく、次の単一表による検索と同じ意味です。 SELECT CODE FROM NATION WHERE POPULATION / AREA < 100;

共感・感謝の気持ちを伝えよう!

質問者からの補足

申し訳ございません。 各表の構造はこのようになります。 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) 回答のほどよろしくお願い致します。

関連するQ&A

  • SQL文(副問合せについて)

    SELECT URIAGE_NO FROM URIAGE AS U1 WHERE URIAGE_SURYO > (SELECT AVG(URIAGE_SURYO) FROM URIAGE AS U2 WHERE U1.HINMOKU_CODE = U2.HINMOKU_CODE); 上記SQLの構文で (SELECT AVG(URIAGE_SURYO) FROM URIAGE AS U2 WHERE U1.HINMOKU_CODE = U2.HINMOKU_CODE この部分の論理がわかりません。 書籍では「HINMOKU_CODEごとのURIAGE_SURYOの 平均を求める」ということですが、何故このように なるのかがわかりません。副問合せではGROUP BY句 が使えないので、非常に困っております。 下記にデータを記載致します。 以上、宜しくお願いします。 ■主問合せ URIAGE.NO HINMOKU_CODE URIAGE_SURYO 001 BP001 10 002 BP002 20 003 BP002 30 004 BP002 10 005 BP001 20 006 BP003 30 007 BP004 10 008 BP004 20 009 BP003 20 ■副問合せ HINMOKU_CODE AVG(URIAGE_SURYO) BP001 10 BP002 20 BP003 25 BP004 15 ■結果 URIAGE.NO HINMOKU_CODE  003 BP002 005 BP001 006 BP003 008 BP004

  • グループ関数の結果について

    以下、SQLコマンドを入力するとレコードが選択されない結果になってしまいます。areaの平均より高いものが出力されるはずなのですが何故でしょうか? / 1 select nation,area 2 from nation 3 group by nation, area 4* having area > avg(area) SQL> / レコードが選択されませんでした。 SQL> desc nation; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- CODE NOT NULL NUMBER(5) NATION NOT NULL VARCHAR2(28) CAPITAL VARCHAR2(20) AREA NUMBER(22) POPULATION NUMBER(22)

  • 副問い合わせ

    UPDATE `hoge` SET `area` = ( SELECT area FROM `hogeArea` WHERE `code` = "001000" ) WHERE `code` = "000019" AND `type` = "02"; 上記のようなUPDATEは無理ですか? MySQLは副問い合わせは無理でしょうか?

  • unionでマージした副問合せを結合

    2つの表をunionでマージした結果を副問合せで使用し、この副問合せを他の表とwhereで結合するとORA-00918: 列の定義が未確定です。がでます。こんな感じです。 副問合せそのものは単独で実行してもエラーにならないので結合に問題があるようです。 どなたか回答お願いします。行き詰っています。 select as.xx1,asxx2 from (select * from aa union select * from bb) as, af where as.xx1=af.xx1;

  • 副問合せの書き方について

    実行したい内容は、『同一ナンバー内で1番IDが低いコードNOが2のタイトルを出す』といった内容になります。 以下のように書いて実行したところ、『EXISTSを使わないサブクエリでは、サブクエリの選択リストには、式を1つだけしか使えません。と表示されました。』自身のSQL文に問題があるかもしれませんが、現状は下記のSQL文となっています。 "SELECT id, code, num, title FROM contents WHERE code=2 AND id IN (SELECT MIN(id), num FROM contents GROUP BY num)" 副問合せで、同一ナンバーで1番IDが低いIDを取得し、取得したIDをもとに タイトルを出そうとしました。 どなたか御指導御願い願えませんでしょうか。 宜しく御願いいたします。

  • 副問合せをいれたINSERT文で、問合せ結果が無い場合

    副問合せをいれたINSERT文で、問合せ結果が無い場合 環境はSQL Server2005です。 テーブルA,テーブルBが存在し、テーブルAにレコード追加する際に一部をテーブルBから抽出して、 INSERTしようとしています。 [SQL文]  INSERT INTO テーブルA(フィールド1, フィールド2, フィールド3,フィールド4・・・)   SELECT 'AAA', 'BBB' ,B.フィールド3, B.フィールド4 ・・・   FROM テーブルB B WHERE ~ この場合、テーブルBにWHEREで指定した条件のレコードが存在しない場合はINSERTされなくなってしまいます。 存在しない場合は、該当のフィールドにはNULLをいれたいのですが、テーブルBからの結果が存在しない場合でも テーブルAにINSERTする方法はありますか?

  • SELECTのスピード

    SELECTのスピードでどの方法が 検索スピードが速いのか教えてもらいたいのですが Aのテーブル DENNO CODE Bのテーブル CODE NAME Aのテーブルを主にAのCODEでBのテーブルを参照したい時 (1) SELECT A.DENNO,A.CODE, (SELECT B.NAME from B where A.CODE=B.CODE) AS NAME from A (2) SELECT A.DENNO,A.CODE,B.NAME FROM A LEFT JOIN B ON A.CODE=B.CODE (3) SELECT A.DENNO,A.CODE,B.NAME FROM A , B WHERE A.CODE=B.CODE(+)

  • クエリー

    お世話になっております。 あるクエリーが解決できなくて困っています。 データベース名:world テーブル名:country, city, countryLanguage 条件: 3つ以上の言語を持っている国と、人口が100万人以上 上の条件が当てはまる、language name, country name, country populationを表示させる。 mysql> select country.Name, countrylanguage.Language, country.Population -> from city, country, countrylanguage -> where (countrylanguage.CountryCode = country.Code) and (country.Populatio n > 100000000) -> order by country.Population DESC でやっても条件に合わずに駄目でした。 3つ以上の言語を持っている国という条件をどのように指定したらいいのか分からずに困っています。 ご教授お願いします。

    • ベストアンサー
    • MySQL
  • UPDATE文(副問合せ?)について

    うまく説明できないのですが、下記のようなテーブルがあります。 テーブル名:A 項目: A1 A2 A3 A4 AテーブルのA1項目に「5」がセットされているデータについて、 A2に123、A3に321をセットしたいのです。 うまくいかない例ですが、下記のようなイメージです。 UPDATE A set A2=123,A3=321 FROM (SELECT * FROM A WHERE A1 = '5') ちなみに下の書き方はダメです。 「SELECT * FROM A WHERE A1 = 5」の部分は、必ず使用し、変更不可です。 × UPDATE A set A2=123,A3=321 WHERE A1 IN(SELECT A1 FROM A WHERE A1 = 5) 変な質問ですいませんが、何か方法があるのでしょうか。 よろしくお願いします。

  • SQL文で質問があります。

    商品マスタがあり、データは下記の感じで登録されています。  コード | 商品名  | 商品カナ | 分類コード ・・・ ---------------------------------------------------------  0001  | マウス  | マウス  | 01     ・・・  0002  | キーボード| キーボード| 01     ・・・  0003  | モニター | モニター | 01     ・・・          ・          ・          ・ SQL文で質問があります。 下記のSQLでは取得できるんですが・・・ SELECT * FROM M_SHOHIN WHERE code = ANY('{0001,0002,0003}'); 下記のSQLを実行したらエラーが出力されました。 SELECT * FROM M_SHOHIN WHERE code = ANY(  SELECT ARRAY_AGG(code) AS code FROM M_SHOHIN WHERE class_code = '01' ); ERROR: operator does not exist: character varying = character varying[] HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. なので下記のようにCASTをするようにして実行したらエラーは出力されなくなりましたがデータの取得ができませんでした。 SELECT * FROM M_SHOHIN WHERE code = ANY(  SELECT CAST(ARRAY_AGG(code) AS VARCHAR) AS code  FROM M_SHOHIN WHERE class_code = '01' ); どのようにすれば取得できますでしょうか。 説明が下手で申し訳ありませんがアドバイスいただけませんでしょうか。 データベースはPostgreSQL 8.4.9です。 宜しくお願いします。