SQL-оператор, имеющий МАКС (некоторые + вещь) = некоторые + вещь - PullRequest
2 голосов
/ 20 апреля 2010

У меня проблемы с 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'.

Этот валидатор говорит, что все в порядке, Access говорит, что это не хорошо.

Это сообщение, которое я получаю: «Вы пытались выполнить запрос, который не включает указанное выражение« max (время + дата) = время + дата и cardto = 'VIP' и cardnr = 'как часть совокупности функция ".

Может кто-нибудь объяснить, что я делаю неправильно, и как это правильно сделать? Спасибо

Примечание: имена полей и таблиц переведены и не вступают в противоречие с какими-либо зарезервированными словами, у меня нет проблем с именами.

1 Ответ

3 голосов
/ 20 апреля 2010

Попытайтесь думать об этом так - HAVING применяется после агрегирования. Поэтому его нельзя сравнивать с неагрегированными выражениями (ни для времени + даты, ни для 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' к внешнему запросу может еще больше повысить производительность. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...