• ベストアンサー

副問い合わせでのNULLの抽出方法

SQLについての質問です。 副問い合わせを使用したとき、NULLのデータも含めて抽出したいの ですが、どうもうまくいきません。 やりたいことを説明すると、まず以下の構造のテーブルがあります テーブル    コード 金額  -------------- 01  |100   01  |110   02  |090   02  |080   03  |200   04  |100   04  |150   05  |400   09  |350   null |100   null |200   集約後データ コード -------- 01  |<--- 1件目 02  |<--- 2件目 03  |<--- 3件目 04  |<--- 4件目 05  |<--- 5件目 09  |<--- 6件目 null |<--- 7件目 まず、テーブルをコードで集約します。集約された結果のデータで上位○件と いう制御をかけたい為、ROWNUMを使用しています。 ただ、実際にほしいデータは集約する前のデータの為、一度集約とROWNUMを使って 絞りこんだデータを副問い合わせしています。 但し、このときNULLが入ったコードも取得する必要があります。 現在のSQLはこんな感じです。 SELECT コード、SUM(金額) FROM テーブル WHERE コード IN ( SELECT コード FROM テーブル WHERE ROWNUM <= 10 GROUP BY コード ) GROUP BY コード このSQLだと、NULLが省かれてしまうため上位6件までしか抽出できません。 実際、NULLを含んだデータを副問い合わせで取得することは可能でしょうか? データベースはオラクル9iです。 宜しくお願いします。

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

  • ベストアンサー
  • timber
  • ベストアンサー率29% (218/739)
回答No.2

SELECT A.コード, SUM(A.金額) FROM テーブル A, ( SELECT DISTINCT NVL(コード, '*') AS コード FROM テーブル WHERE ROWNUM <= 10 ) B WHERE NVL(A.コード, '*') = B.コード GROUP BY A.コード; こんな感じでどうでしょう。

jyo-chi
質問者

お礼

できました!!ありがとうございます。 NVLは知っていたのですが、フィールドと 条件の両方にかける方法は思いつかなかったです。 回答でもらったSQLは使わなかったのですが、参考にして 元のSQLを以下のように改造して成功しました。 SELECT コード、SUM(金額) FROM テーブル WHERE nvl(コード,'*')  IN(SELECT nvl(コード,'*')    FROM テーブル    WHERE ROWNUM <= 10    GROUP BY コード ) GROUP BY コード 本当にありがとうございました。今日は徹夜せずに 帰れそうです。

その他の回答 (1)

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

WHERE コード IN を WHERE コード(+) IN というふうにできるかな?

jyo-chi
質問者

補足

早速の回答、ありがとうございます。 確認してみましたが、ダメでした。 副問い合わせに対しての外部結合は無理のようです。

関連するQ&A

  • sqlのwhereで指定した条件の前後を取得したい

    テーブル=T) KEY DATA 001 あ 002 い 003 う 004 え 005 お SQL) SELECT DATA FROM T WHERE KEY = 003 ; 上記のSQLでは、「う」のデータしか取得できませんが、 「003」の前後1件、合計3件の「い」「う」「え」を取得する方法を教えて下さい。 ちなみに、 SELECT DATA FROM T WHERE KEY >= 003 AND ROWNUM <= 2 と SELECT * FROM ( SELECT DATA FROM T WHERE KEY < 003 ORDER BY KEY DESC ) WHERE ROWNUM < 1 のUNIONでは上手く行きませんでした。 よろしくお願いします。

  • SQLServer7.0で、SELECT文で列を抽出する ※Nullと0の条件について

    SQLServer7.0で、SELECT文で列を抽出する際なんですが、 列A 列B --------- 1  Null 2  Null 3  1 ↑のテーブルから、列Aの1、2だけを抽出するSELECT文を SELECT * FROM XXX WHERE 列B <> 1 と作成したのですが、うまく動作しません(汗) データが一件も取れないのです。(列B:tinyint型、Null許容) テーブル内のデータをNull→0にして、同SELECT文で抽出すればうまくいったのですが。。 Nullデータを、<>XX という条件で取得することはできないんですかねえ・・・。 それとも、テーブルの設定か、条件の記述方法がまずいんでしょうか。 どなたか、ご存知あればアドバイスをお願いします。

  • 抽出結果を1件ずつ次の抽出条件に使う方法

    Oracleで下記のようなデータ処理を実現する方法を調べています。 (1)特定の条件でデータを抽出する。  select X from TABLE1 where Y="test" (2)(1)で抽出したデータを別の抽出条件の値として1つずつ使用し、  別のsqlにてデータを抽出し、件数を取得する。 select count(*) from TABLE2 where Z = aaa  ※aaaには(1)の結果を順に入れる。 2,3件であれば手作業で(2)を実施すればよいのですが、(1)の結果が数100件 になっているため、(2)をループ処理させたいです。 PL/SQLが必要なのでは?と思いつつ、使ったことがありません。 少し調べてはみましたが、よくわからず、困っています。 特に難しい処理ではないと思ってはいるのですが、期日まで時間がなく、質問 させていただきました。 一時的なデータ確認のためだけなので、専用にプログラムを組むのはしたく 無いと思っています。 参考になる情報をいただければ幸いです。 もちろん、(2)のサンプルコードなどいただければ大変助かります。 どうぞよろしくお願いします。

  • rownumを使用して・・・。

    ご相談したい事があります。 Oracle9iにて約100万件あるデータを抽出するのに一度に100万件を抽出すると時間が掛かってしまうと思い、rownumを使用して1万件単位で抽出したいのですが、SqlPlusにて以下のSQLを実行すると「レコードが選択されませんでした」と返ってきます。 SELECT * FROM tbl WHERE rownum >= 10001 AND rownum <= 20000; どうしてなのでしょうか?rownumではこのような使い方では使用できないのでしょうか? ちなみにWHERE以下を rownum >= 1 AND rownum <= 10000; にすると1万件抽出できます。 お分かりの方がいらっしゃれば、ご教授願います。

  • Access での抽出条件方法

    助けてください。 Accessを使用して、会員管理の印刷を行っています。 会員情報テーブルに支部と部会の項目がありますが、支部にはデータ(2桁)が入ってますが、部会にはデータが無い(NULL)状態のとき、下記のSQLでは、NULLデータも抽出してこない状態です。どうしても、NULLデータまでヒットさせたい場合は、どうすれば良いでしょうか? INSERT INTO 印刷用作業テーブル SELECT * FROM 会員情報テーブル WHERE リスト表示=FALSE AND (IIF(支部=NULL,' ',支部)+IIF(部会=NULL,' ',部会) ORDER BY 会員番号

  • 副問合せについて

    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)

  • OracleSqlで『RORNUM』の使い方について

    VB6でコーディングをしています DBはOracle7.3です SELECT A.One, A.Two, SUM(A.Three) Three,  FROM A  WHERE ( A.One = '001' AND A.Two = '3')  GROUP BY A.One, A.Two ORDER BY Three DESC  上記のようにAテーブルの項目One,Two,Threeを抽出するSQLで 重複項目One,Twoでグループ化したThreeの合計値の内、上位25件を 取得したいのですが... SELECT *  FROM ( SELECT A.One, A.Two, SUM(A.Three) Three,  FROM A  WHERE ( A.One = '001' AND A.Two = '3')  GROUP BY A.One, A.Two ORDER BY Three DESC ) WHERE ROWNUM <= 25 上記のように記述するとORDER BY句でエラーになります ORDER BY句をWHERE ROWNUMの下に記述するとSQLはとおりますが 条件が変わってしまいます。 抽出条件でマージ、降順ソートしたものに対して上位n件の取得をするには どうすれば良いのでしょうか?

  • 副問合せ 続(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-Server 6.5で最初の数行を抽出するには?

    SQL-Server 6.5で最初の数行を抽出するにはどのようにすればよろしいでしょうか? Oracleの場合、 SELECT * FROM TABLE_NAME WHERE ROWNUM <= 10; JETの場合、 SELECT TOP 10 * FROM TABLE_NAME; ですが、これをSQL-Serverで行う場合をご教授下さい。

  • 副問い合わせの限界値はどれくらいなのでしょうか? 

    副問い合わせの限界値はどれくらいなのでしょうか?  現在下記のようなSQLを考えています。 SELECT * FROM A_TABLE WHERE a_field in ( SELECT a_field FROM B_TABLE WHERE b_field := ?c ) ; ※(便宜上、外部変数の指定を[:= ?c]としました) B_TABLEの検索に引っかかったデータをinの条件にしてA_TABLEを検索するのですが、 B_TABLEの検索で出力される結果(サブクエリで出力される件数)が 現在の理論値は平均でおおよそ1000件、最大10万件になる予定です。 これに対し、10万件での問い合わせに副問い合わせの実行はmysqlで可能なのでしょうか?  現状のテスト環境では10万件のテストデータを用意できない状況です・・・。 また、どなたか副問い合わせでのサブクエリ出力件数の限界値をご存知の方がいらっしゃいましたらご教授頂ければ幸いです。 宜しくお願い致します。

    • ベストアンサー
    • MySQL