我在使用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年之前具有最新(time+date)的行,然后只选择cardto='VIP‘的行。
此validator表示正常,Access则表示不正常。
我得到的消息是:“您试图执行的查询没有将指定的表达式'max(time+date)=time+date and cardto='VIP‘and cardnr=’作为聚合函数的一部分。”
有没有人能解释一下我做错了什么以及正确的做法?谢谢
注意:字段和表名是经过翻译的,不会与任何保留字冲突,我对名称没有任何问题。
发布于 2010-04-20 04:35:05
试着这样想-- HAVING是在聚合完成后应用的。因此,它不能与非聚合表达式进行比较(既不能用于time+date,也不能用于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‘可以进一步提高性能。
https://stackoverflow.com/questions/2670608
复制相似问题