MS Access查询每个OrderNo对应最新DueDate的问题及优化方案
问题诊断
你的实现存在3个核心问题:
- DMax函数的条件参数语法错误。你将
[qry1]![UniqOrderNo]直接写在了条件字符串内部,Access不会主动解析字符串里的字段引用,导致实际生效的匹配条件是[OrderNo]='[qry1]![UniqOrderNo]',没有符合的记录自然返回空结果。如果你的OrderNo是数值类型,额外添加的单引号还会导致类型匹配失败。 - qry2的查询逻辑冗余。qry1已经生成了去重的订单号列表,不需要再和DateList做内连接,连接后反而会让结果行数和原DateList表一致,出现重复的订单号记录。
- qry1代码中的
GROUPBY为拼写错误,正确写法是两个单词分开的GROUP BY,如果qry1已经能正常生成去重订单列表,大概率是你粘贴时的笔误。
最优实现方案
不需要拆分多个查询,也不需要调用DMax域函数,直接对原DateList表做分组聚合查询即可,性能和可读性都更高:
SELECT OrderNo, MAX(DueDate) AS LatestDueDate FROM DateList GROUP BY OrderNo;
该查询直接按照OrderNo分组,对每个分组内的DueDate取最大值,就是你需要的每个订单对应的最新到期日,一步即可得到去重的正确结果。
原写法修正方案
如果你坚持要保留原来的双查询逻辑,可将qry2修改为如下写法(不需要关联DateList表,同时修正DMax的条件拼接逻辑):
如果OrderNo为数值类型:
SELECT UniqOrderNo, DMax("[DueDate]", "[DateList]", "[OrderNo] = " & [UniqOrderNo]) AS LatestDueDate FROM qry1;
如果OrderNo为文本类型:
SELECT UniqOrderNo, DMax("[DueDate]", "[DateList]", "[OrderNo] = '" & [UniqOrderNo] & "'") AS LatestDueDate FROM qry1;
内容的提问来源于stack exchange,提问作者Hamtash
相关产品推荐
相关产品推荐

