Я согласен с подходом 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 в новый запрос доступа, отбросил условие WHERE
из подзапроса, и получил точно такой же результат, как этот запрос --- нет строк вернулись:
SELECT e.title
FROM Equipment AS e
WHERE
e.EquipmentID Not In (
SELECT EquipmentID
FROM DownPeriod
);
Так считает эту ситуацию с перспектива двигателя db. Используя мою версию таблицы Downloads
, она имеет набор значений (1, 2, Null и 3) из подзапроса. Вы просите его показать строки из Equipment
, где EquipmentID
is NOT IN этот список значений. Двигатель db даст вам строки, для которых это условие True
.
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
);
Так вы запрашивая не-'UpDate' оборудования, а затем 'оборудования UpDate' .. возможно, что ваша колонка ОБНОВЛЯТЬ наполняется«»вместо истинного NULL? – StuckAtWork
Хотя я не могу получить пример того, что я говорю, я думаю, что это может быть связано с Access, делая различие между пустой строкой и NULL. Можете ли вы использовать Nz (UpDate, "") = "" и посмотреть, одинаково ли это? (возможно, это было исправлено в 2010 году, так как я уверен, что видел это в 2003 году) – phillyd
Я так не думаю. Я принял ваше предложение и установил значение по умолчанию Update равным Null, и никаких изменений не было. Что касается вашего предложения фили, то это тоже не сработало, но вы можете сделать предложение. – HelloWorld