SQL-заявление, имеющее max (некоторые + вещь) = некоторые + вещь
Вопрос
У меня проблемы с Microsoft Access 2003, оно жаловаться на это утверждение:
select cardnr
from change
where year(date)<2009
group by cardnr
having max(time+date) = (time+date) and cardto='VIP'
То, что я хочу сделать, потому что для каждого отчетливого Cardnr в замене таблицы, чтобы найти ряд с последней (время + дата), которая находится до 2009 года, а затем просто выберите строки с Cardto = 'vip'.
Этот валидатор говорит, что все в порядке, доступ говорит, что это не в порядке.
Это сообщение, которое я получаю: «Вы пытались выполнить запрос, который не включает указанное выражение« MAX (время + дата) = время + дата и CARDTO = «VIP» и Cardnr = 'как часть агрегатной функции. "
Может ли кто-нибудь, пожалуйста, объясните, что я делаю не так, и правильный способ сделать это? Спасибо
Примечание. Поле и имена таблиц переведены и не сталкиваются с любыми зарезервированными словами, у меня нет проблем с именами.
Решение
Попробуйте подумать об этом, как это - наносится после выполнения агрегации. Поэтому он не может сравниться с неугрегированными выражениями (ни за время + дата, ни для Cardto).
Однако, чтобы получить последний (принцип такой же для получения строк, связанных с другими агрегированными функциями, как WEEL) Время и дата, вы можете сделать что-то вроде:
SELECT cardnr
FROM change main
WHERE time+date IN (SELECT MAX(time+date)
FROM change sub
WHERE sub.cardnr = main.cardnr AND
year(date)<2009
AND cardto='VIP')
(Предполагая, что часть даты на вашем поле времени одинакова для всех записей; имея два поля на дату / время не в ваших интересах, а также с использованием зарезервированных слов для имен полей могут быть нанесены в определенные случаи)
Он работает, потому что подзапрос фильтрован только на записях, которые вас интересуют из внешнего запроса.
Применение того же года (дата) <200 и CARDTO = «VIP» на внешний запрос может повысить производительность.