2012-06-27 2 views
3

Просто нужно несколько быстрых разъясненийAccess 2010 Запрос Путаница

У меня есть 2 запросов в моей базе данных Access, который должен вернуть Обратные результаты:

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

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

2-й раз не исключает перед In. Мое замешательство возникает из-за того, что указанный выше запрос не возвращает никаких результатов, если поле EquipmentID имеет по меньшей мере 1 нулевое значение в таблице DownPeriod.

Он отлично работает, если поля заполнены, и список обратных запросов всегда работает. Это заставляет меня думать, что есть проблема с нулевым значением.

Теперь это поле никогда не должно быть пустым, но я хотел знать, могу ли я все-таки заставить его работать в маловероятном случае, когда произошел нуль.

Благодарим вас за продвинутый!

+1

Так вы запрашивая не-'UpDate' оборудования, а затем 'оборудования UpDate' .. возможно, что ваша колонка ОБНОВЛЯТЬ наполняется«»вместо истинного NULL? – StuckAtWork

+1

Хотя я не могу получить пример того, что я говорю, я думаю, что это может быть связано с Access, делая различие между пустой строкой и NULL. Можете ли вы использовать Nz (UpDate, "") = "" и посмотреть, одинаково ли это? (возможно, это было исправлено в 2010 году, так как я уверен, что видел это в 2003 году) – phillyd

+0

Я так не думаю. Я принял ваше предложение и установил значение по умолчанию Update равным Null, и никаких изменений не было. Что касается вашего предложения фили, то это тоже не сработало, но вы можете сделать предложение. – HelloWorld

ответ

4

Try присоединяется:

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

+0

К сожалению, я должен что-то делать, потому что это тоже не сработало. Наверное, мне просто придется иметь дело с тем, что это не 100% доказательство дурака. Я благодарю вас за то, что нашли время, чтобы помочь вам! :) – HelloWorld

+0

Это может привести к тому, что 'UpDate' не будет истинным значением NULL. Попробуйте 'WHERE DownPeriod.UpDate =" "' или 'WHERE DownPeriod.UpDate <>" "' и посмотрите, дает ли это ожидаемый ответ. Возможно, вам даже понадобится объединить null и «» с оператором OR; все зависит от того, как вводится ваша информация (например, импорт Excel часто импортирует «как текстовое поле вместо реального нуля») – StuckAtWork

+0

Просто что-то увидел, извините. Это не идентификатор, который является нулевым, это отдельное поле: UpDate, которое может быть нулевым. (Мое впечатление, что у него есть БД простоя, и если UpDate является нулевым, это может означать, что он не использовался или не вышел из магазина и т. Д., Поэтому он хочет знать «все новое оборудование» или whathaveyou на основе UpDate) , В этом случае предложение where в вашем комментарии не будет работать, поскольку идентификатор действительно существует, UpDate не делает этого. Также в его последнем комментарии говорится, что он еще не исправил свою проблему, поэтому нам нужно будет увидеть. Проверьте мой последний комментарий к исходному вопросу. – StuckAtWork

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 в новый запрос доступа, отбросил условие 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 
     ); 
+0

Ха-ха не беспокоится, я ценю объяснение. Я знал, что это что-то связано с NULL, и что он завинчивается фильтром. Я думаю, что я использую фиктивную дату, такую ​​как 02/01/1660, как значение по умолчанию, которое я могу проверить проще, чем null. – HelloWorld

+2

Согласны с HansUp, не используйте фиктивные значения. Значения Null и Empty существуют по какой-то причине. Это может не повлиять на вас сейчас, но в дальнейшем усилия потребуют постоянных обходов для ваших фиктивных значений. Изображение когда-нибудь ищет даты между X и Y или, возможно, до Z; ваши фиктивные значения появятся, даже если они могут быть неприменимы. Нулевые значения не будут регистрироваться в такой математике и будут избегаться SQL (это то, что вам нужно) – StuckAtWork

+0

@StuckAtWork Хорошо сказано.Он также должен подумать о мудрости усложнения чего-то, что в противном случае было бы так же просто, как «Min (date_field)» – HansUp