首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有MAX(some+thing)=some+thing的SQL语句

具有MAX(some+thing)=some+thing的SQL语句
EN

Stack Overflow用户
提问于 2010-04-20 04:27:54
回答 1查看 3K关注 0票数 2

我在使用Microsoft Access 2003时遇到了问题,它在抱怨下面这句话:

代码语言:javascript
复制
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=’作为聚合函数的一部分。”

有没有人能解释一下我做错了什么以及正确的做法?谢谢

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-20 04:35:05

试着这样想-- HAVING是在聚合完成后应用的。因此,它不能与非聚合表达式进行比较(既不能用于time+date,也不能用于cardto)。

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

代码语言:javascript
复制
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‘可以进一步提高性能。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2670608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档