使用TOP 5访问SQL返回超过5个结果?

时间:2009-05-20 13:07:46

标签: sql ms-access sorting

我正在使用以下声明

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前端进行参数化查询。

2 个答案:

答案 0 :(得分:30)

这是Access中top指令的已知效果,但它并不是很有名......

top指令不会返回前n项,因为很容易让人相信。相反,它至少返回由结果排序确定的n个不同的项目。

在大多数情况下它是相同的,但在您的示例中,第5到第8项具有相同的排序值,所有这些都包括在内。它返回前五个项目,但也返回与第五个项目具有相同排序值的所有项目。

如果您不对表格应用任何排序,则会考虑所有字段,因此如果结果中有唯一字段,则查询将始终返回五个项目。当然,如果唯一字段包含在订购中,也是如此。

SQL的其他方言可能表现不同。例如,T-SQL(SQL Server)中的top指令永远不会返回超过n个项目。但是,通过指定子句with tiesorder 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记录集。