Запрос на объединение выдает исключение «Недопустимое использование нуля»

У меня есть два запроса в Access. Оба они довольно неприятны в создании, но в конце процесса они имеют одинаковое количество полей с одинаковыми типами данных. Они оба работают независимо, принося ожидаемые результаты.

К сожалению,

SELECT * 
FROM [qry vaBaseQuery-S2]
UNION ALL SELECT *
FROM [qry BaseQuery];

выдает две ошибки "Недопустимое использование нуля" одну за другой. Раньше я без проблем использовал union для запросов Access 2000 с нулевыми значениями, поэтому я немного озадачен. Кто-нибудь может подсказать, что здесь может происходить?

Дополнительная информация, которая может иметь значение:

  • Ни в одном запросе нет пустых строк.

  • UNION SELECT * (без ALL) выдает ту же ошибку, но только один раз?!

Редактировать:

  • Использование имен полей вместо * не помогает

Редактировать2:

  • Учитывая, что в любом случае запрос должен был быть запросом на создание таблицы, запускаемым из формы, я просто оставил его как два отдельных запроса (один на создание таблицы и один на добавление) и запускал их последовательно. Учитывая приведенные ниже ответы, это кажется гораздо меньшим усилием, чем попытка выяснить, против чего возражает Access.

person mavnn    schedule 08.06.2009    source источник
comment
Есть ли шанс, что мы сможем увидеть любой из двух других запросов?   -  person BIBD    schedule 08.06.2009
comment
Каждый из запросов состоит как минимум из 6 подзапросов. За два года существования печатная форма превратилась в электронную таблицу, которая была преобразована в базу данных Access (кем-то, не имевшим опыта работы с Access), которая затем была передана двум разным командам. На каждом этапе собираемые данные менялись. Затем кто-то дал его нам и сказал: эй, почему бы вам не сопоставить все данные в один базовый запрос, чтобы мы могли запускать отчеты по всему набору данных? Да правильно. Что действительно раздражает? Первоначальную проблему было бы тривиально решить с чистого листа бумаги.   -  person mavnn    schedule 09.06.2009


Ответы (3)


Скорее всего, у вас есть некоторые условные (Iif()) преобразования данных (CStr() или аналогичные) в ваших исходных запросах. Access может оптимизировать отдельные запросы иначе, чем в объединении; иногда он оценивает условные части в очень странном порядке.

Как и в следующем упрощенном случае:

Select Iif(int_fld is null, '0', CStr(int_fld)) As Something

Это может вызвать "Недопустимое использование нуля" или нет - зависит от порядка оценки.

Изменить: забыл написать правильное выражение, которое не дает этой ошибки:

Select CStr(Iif(int_fld is null, 0, int_fld)) As Something
person Arvo    schedule 08.06.2009
comment
Звучит интересно, но не могли бы вы опубликовать пример, который действительно вызывает ошибку, пожалуйста? Я думаю, вы упростили до такой степени, что это действительно работает! например Я не могу получить это сообщение об ошибке: Выберите DISTINCT Iif(1 равно null, '0', CStr(1)) As Something FROM Calendar UNION Выберите DISTINCT Iif(1 равно null, CStr(1), '0') FROM Calendar ; - person onedaywhen; 09.06.2009
comment
Извините, я не могу найти конкретного примера. Конечно, мой упрощенный пример не выдает ошибок; фактический запрос был длиной около 20-30 строк, содержал сложные подзапросы и т. д. и т. д. - и он выдавал или не выдавал ошибку в зависимости от фактических данных (план оптимизации). Я только что опубликовал пример того, какие операции могут быть проблематичными. - person Arvo; 09.06.2009

Арво написал: «иногда [ACE/Jet] оценивает условные части в очень странном порядке» — я могу поручиться за это, и не только при использовании UNION. Вот что я недавно опубликовал на SO, где простое добавление предложения WHERE в запрос приводило к тому, что движок оценивал в неправильном порядке, вызывая ошибку «Неверный вызов процедуры», и я не мог найти способ обойти это.

SQL для анализа многострочных данных?

Я предлагаю вам опубликовать код SQL из двух объектов Query. Возможно, кто-то подскажет, с чем могут быть проблемы в двигателе.

person onedaywhen    schedule 08.06.2009

Как упоминалось в отредактированном вопросе: учитывая, что запрос в любом случае должен был быть запросом на создание таблицы, запускаемым из формы, я просто оставил его как два отдельных запроса (один на создание таблицы и один на добавление) и запускал два последовательно.

person mavnn    schedule 09.06.2009