3

簡単な説明が必要です

逆の結果を返す必要がある Access データベースに 2 つのクエリがあります。

SELECT Equipment.title
FROM Equipment
WHERE (((Equipment.[EquipmentID]) Not In (

    select EquipmentID
    from DownPeriod
    where UpDate is null
)));

2 番目は、In の前の Not を除外するだけです。私の混乱は、EquipmentID フィールドに DownPeriod テーブルに少なくとも 1 つの null 値がある場合、上記のクエリが結果を返さないという事実から来ています。

フィールドが入力されていれば正常に機能し、逆クエリ リストは常に機能します。これは、null 値に問題があると思わせます。

現在、このフィールドは決して null であってはなりませんが、万が一 null が発生した場合でもこれを機能させることができるかどうかを知りたかったのです。

よろしくお願いします!

4

2 に答える 2

4

結合を試してください:

SELECT Equipment.title FROM Equipment INNER JOIN DownPeriod
ON Equipment.EquipmentID = DownPeriod.EquipmentID
WHERE DownPeriod.UpDate is null

SELECT Equipment.title FROM Equipment INNER JOIN DownPeriod
ON Equipment.EquipmentID = DownPeriod.EquipmentID
WHERE DownPeriod.UpDate is not null

構文の変更によって問題が解決するかどうかを確認してください。

これは機能するだけでなく、IN() NOT IN()メソッドを使用するよりも高速な方法だと思います (これは間違っているかもしれませんが、読みやすくなっています)。また、IN->NOT IN と同じように、「null ではない」基準をすばやく変更する機能も追加されます。

于 2012-06-27T15:52:57.030 に答える
3

私は StuckAtWork のアプローチに同意します。ただし、元のアプローチで希望する結果が得られなかった理由を理解したい場合は、お手伝いできると思います。

状況を複雑にする可能性のある空の文字列に問題がある可能性があります。しかし、空の文字列が含まれているかどうかに関係なく、より基本的な考慮事項があります。

これが私のバージョンのEquipmentテーブルです。

EquipmentID title
1           one
2           two
3           three

そして、これが私のバージョンのDownPeriodテーブルです。

ID EquipmentID text_field
1  1           one
2  2           two
3              Null
4  3           three

あなたのUpDateフィールドを私のDownPeriodテーブルに含めませんでした。あなたの問題とは無関係です。

SQL を新しい Access クエリに貼り付けWHERE、サブクエリから句を破棄したところ、このクエリとまったく同じ結果が得られました --- 行が返されませんでした:

SELECT e.title
FROM Equipment AS e
WHERE
    e.EquipmentID Not In (
        SELECT EquipmentID
        FROM DownPeriod
        );

したがって、この状況を db エンジンの観点から検討してください。私のバージョンのDownloadsテーブルを使用すると、サブクエリからの一連の値 (1、2、Null、および 3) が含まれています。その値のリストにない場所Equipmentからの行を表示するように求めています。db エンジンは、その条件が である行のみを提供します。EquipmentIDTrue

Nullが問題です。それぞれについてEquipmentID、その値がサブクエリ セットに存在しないかどうかを考慮すると、わかりません。それNullは未知の値です...そして未知の値は、EquipmentIDそれが考慮している電流と同じかもしれません...または何か他のものかもしれません. しかし、db エンジンは実際の値を認識していないため、条件を として評価できずTrue、その行を結果セットに含めません。テーブルのすべての行で同じことが起こりEquipmentます...したがって、クエリの結果セットは空です(行がありません)。

以下のような句Nullを使用して、サブクエリの結果セットから値を除外することで、目的の結果を得ることができます。WHEREしかし、StuckAtWork の提案はより良い方法だと思います。

SELECT e.title
FROM Equipment AS e
WHERE
    e.EquipmentID Not In (
        SELECT EquipmentID
        FROM DownPeriod
        WHERE EquipmentID Is Not Null
        );
于 2012-06-27T16:36:27.450 に答える