我正在使用以下声明
SELECT TOP 5 rootcause, COUNT(IIF(accountability="Team 1",1,0))
FROM MOAQ
WHERE CDT=1
GROUP BY rootcause
MOAQ
是另一个从4个表中返回大约20个字段的查询,没什么特别的。这按预期工作,我得到了5个结果。
如果我在条件字段上添加ORDER BY
子句,但我开始得到8个结果。如果按第一个字段排序,则没有问题。
任何人都知道可能会发生什么?
编辑以澄清 - 此时我只在Access 2003中进行测试,最终语句将通过ADO从Excel前端进行参数化查询。
答案 0 :(得分:30)
这是Access中top
指令的已知效果,但它并不是很有名......
top
指令不会返回前n
项,因为很容易让人相信。相反,它至少返回由结果排序确定的n
个不同的项目。
在大多数情况下它是相同的,但在您的示例中,第5到第8项具有相同的排序值,所有这些都包括在内。它返回前五个项目,但也返回与第五个项目具有相同排序值的所有项目。
如果您不对表格应用任何排序,则会考虑所有字段,因此如果结果中有唯一字段,则查询将始终返回五个项目。当然,如果唯一字段包含在订购中,也是如此。
SQL的其他方言可能表现不同。例如,T-SQL(SQL Server)中的top
指令永远不会返回超过n
个项目。但是,通过指定子句with ties
和order by
以及top
,可以观察到与Access中相同的行为。
答案 1 :(得分:1)
转到Access 2003帮助名称About ANSI SQL query mode (MDB)中的页面,然后展开“为什么使用ANSI-92 SQL?”主题,你会看到这个:
“使用LIMIT TO nn ROWS子句限制查询返回的行数”
所以只需将Access UI置于ANSI-92查询模式或在代码中使用OLE DB(例如ADO)并添加子句
LIMIT TO 5 ROWS
查询。
...
只开个玩笑!这仅仅是Access数据库引擎记录不良的另一个例子。我认为Access文档团队中的某个人做出了一个不太合理的假设,即Access数据库引擎的所谓ANSI-92查询模式将符合ISO / ANSI SQL-92标准。事实并非如此。Access数据库引擎有自己的专有(即非SQL-92标准)语法TOP n(不要与SQL Server自己专有的TOP n语法混淆,语法不同)。简而言之,它不能解决重复问题。如果条件满足表中的每一行,那么您将获得结果集中表中的每一行。
解决方法是使用游标只读取结果集中的前n行。由于Access数据库SQL不支持过程代码或显式游标,因此您需要在“客户端”端执行此操作,例如打开一个Recordset对象,将前n条记录读入一个伪造的ADO记录集。