2009-05-20 35 views
8

我用下面的语句使用TOP 5访问SQL返回超过5个结果?

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

这是从内部访问还是你从一个程序访问访问?如果是后者,你使用什么连接字符串?你还使用什么版本的Access? – AnonJr 2009-05-20 13:13:16

回答

28

这在Access中top指令的已知作用,但它不是很出名......

top指令不返回顶部n项目,作为一个很容易导致相信。相反,它至少会返回由结果排序确定的不同项目。

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

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

SQL的其他方言可能会有不同的表现。例如,在T-SQL(SQL Server)中,单独的top指令永远不会返回多于n项目。但是,通过指定条款with tiesorder by以及top,可以观察到与Access中相同的行为。

+2

+1有趣!不知道的已知效果 – Andomar 2009-05-20 13:40:16

+0

非常有趣,谢谢 – Lunatik 2009-05-20 14:32:20

1

转到Access 2003帮助名称中的页面About ANSI SQL query mode (MDB),然后展开'为什么使用ANSI-92 SQL?'主题,你会看到这一点:

“使用限制为ンROWS子句限制查询返回的行数”

所以只是把访问用户界面为ANSI-92查询模式或使用OLE数据库(例如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记录集。