2

我在使用 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(time+date)=time+date and cardto='VIP' and cardnr=' 作为聚合函数的一部分。”

有人可以解释我做错了什么以及正确的方法吗?谢谢

注意:字段和表名是翻译的,不与任何保留字冲突,我对名称没有任何问题。

4

1 回答 1

3

试着这样想 - HAVING 在聚合完成后应用。因此,它不能与未聚合的表达式(时间+日期和 cardto 都没有)进行比较。

但是,要获取最后一个(获取与其他聚合函数相关的行的原理相同)时间和日期,您可以执行以下操作:

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')

(假设您的时间字段上的日期部分对于所有记录都是相同的;拥有两个日期/时间字段不符合您的最佳利益,并且在某些情况下对字段名称使用保留字可能会适得其反)

它之所以有效,是因为子查询仅根据您对外部查询感兴趣的记录进行过滤。

将相同的 year(date)<200 和 cardto='VIP' 应用于外部查询可以进一步提高性能。

于 2010-04-19T20:35:05.217 回答