レコードセットが2つあります。レコードセット1とレコードセット2です。RS1にはselect distinct ID from Tableで取得したクエリがはいっています。RS2はRS1で取得したIDを条件にくわえてselect文を投げます。

select ID, ID_NAME from TABLE where ID=RS1!IDといったSQLです。

この時、RS1でIDがないものがあったとします。つまりIDがNULLのものです。
select ID,ID_NAME from TABLE where ID=NULLになった場合、正しくデータを取得できません。ID_NAMEには値があるのに、IDには値がないといったケースです。この時もSQL文でエラーにならないようにしたいのですが、可能でしょうか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/03/11 22:56:19
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.1

回答回数1314ベストアンサー獲得回数393

ポイント100pt

最初のクエリで NULL を除外しておけばよいのではないでしょうか。

SELECT DISTINCT ID FROM TABLE WHERE ID IS NOT NULL
id:akaired

いや、実はIDがNULLのもヒットさせたかったりします。それができるかなと思いまして・・・

2009/03/08 22:56:25

その他の回答2件)

id:Mook No.1

回答回数1314ベストアンサー獲得回数393ここでベストアンサー

ポイント100pt

最初のクエリで NULL を除外しておけばよいのではないでしょうか。

SELECT DISTINCT ID FROM TABLE WHERE ID IS NOT NULL
id:akaired

いや、実はIDがNULLのもヒットさせたかったりします。それができるかなと思いまして・・・

2009/03/08 22:56:25
id:khazad-Lefty No.2

回答回数181ベストアンサー獲得回数27

ポイント27pt

データベースの種類と(使用しているのであれば)使用している言語で状況は変わってくるのですが、

とりあえず、IDにNullが入っていてそれを取得したいのであれば、

プログラム側で、

select ID,ID_NAME from TABLE where ID IS NULL

に二番目のクエリーを切り替えるのが無難かと。

そうじゃなければ、OracleでいうNVL関数(AccessならNZ、SQLSERVERならIsNull関数)を使用する方法もあります。

(ただし、インデックスが使われなくなるためパフォーマンス的には落ちるはずです)

ACCESSなら

select ID,ID_NAME from TABLE where Nz(ID)=Nz(Null)

ORACLEなら

select ID,ID_NAME from TABLE where NVL(ID,'')=NVL(NULL,'')

みたいな感じで。

id:akaired

ご回答ありがとうございます!

2009/03/11 22:55:43
id:kenz-firespeed No.3

回答回数104ベストアンサー獲得回数3

ポイント26pt

IDがNULLの場合、どこの列と関連づけるのですか?

主キーがNULLならデータが取得できなくても当然だと思うのですが・・・

RS2でクエリをかけるテーブルのID列にNULLが1行しかないと仮定して、NULL同士で繋ぐなら

select ID, ID_NAME from TABLE where ID=RS1!ID OR (ID IS NULL AND RS1!ID IS NULL)

で行けるのでは

id:akaired

ご回答ありがとうございます!

2009/03/11 22:55:49
  • id:khazad-Lefty
    過去質問からすると、
    DB,言語は、ACCESSとACCSSのVBAでしょうか?
    質問するときはそのあたりは毎回書いておくとピンとはずれの回答は減るかもしれません。
    特に、VBAといってもなにのVBAか(EXCELとかACCESSとか)によって状況は変わってくるので。
  • id:Mook
    ID が NULL のときは
      SELECT ID,ID_NAME FROM TABLE WHERE ID IS NULL
    ですから、NULL 以外のものを実行した後にこれを合わせて実行すればよいのではないですか?
  • id:kn1967
    それぞれのバージョンもね♪
    微妙に違う時があるから・・・。
  • id:Mook
    あるいは一つのループでやるなら、下記のようでしょうか。

    Do RS1.EOF
      If IsNull(RS1!ID) = True Then
        Sql = "SELECT ID,ID_NAME FROM TABLE WHERE ID IS NULL"
      Else
        Sql = "SELECT ID,ID_NAME FROM TABLE WHERE ID = " & RS1!ID
      End If

      Set RS2 = DB.OpenRecordset(Sql)
      RS2 の処理・・・

      RS1.MoveNext
    Loop
  • id:Mook
    と書きながら、Access 2000 以降はサブクエリが使用できますから、それで間に合うなら
    その方が早いですね。

    SELECT id, id_name FROM table2 WHERE id IN ( SELECT DISTINCT id FROM table1 ) ORDER BY id

    だと一回のクエリ処理ですみますね。

    一応テーブルを変えた例にしました。
    (そもそも同じテーブルなら、クエリを2回にする必要がなさそうだったので。)
  • id:khazad-Lefty
    あと、それからいろいろそれ以前の前提として、
    こういう形でNullを抽出する必要があるというじてんで
    データベースの構造に問題があるんじゃないかという気はします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません