2009-11-09 138 views
2

我在this问题中概述了基本相同的问题,但是我将Microsoft Access用作数据库而不是MySQL。其结果是SQL_CALC_FOUND_ROWS似乎没有提供给我。相信我,我想切换,但目前这是不可能的。通过使用Microsoft Access的查询获取组中的行数

我有一个查询聚合的行数,本质上寻找基于某些键的重复行,使用一组。它看起来像这样:

Select key1, key2, key3, Count(id) 
from table 
group by key1, key2, key3 
having Count(id) > 1 

我需要确定查询将返回的行数(或分组)。

数据库正在通过Java进行访问,所以理论上我可以简单地运行查询,并循环遍历它两次,但我希望更快,最好是基于SQL的。有任何想法吗?

回答

3

MS Access的记录数应该会给你你需要的,还是我错过了什么?

如果需要从键不同的值,试试这个

SELECT COUNT(*) AS Expr2 
    FROM (
     SELECT DISTINCT [key1] & "-" & [key2] & "-" & [key3] AS Expr1 
      FROM Table1 
     ) AS SUB; 
+0

*数据库正在通过Java *进行访问,但我猜Java具有相当于RecordCount – Andomar 2009-11-09 19:22:55

+0

您能否详细说明一下?我如何查看记录数?请注意,我通过Java访问这个,而不是访问前端... – 2009-11-09 19:23:11

+0

@Andomar不,它没有。无法从Java ResultSet对象中获取记录计数。 – 2009-11-09 19:29:19

0

当您创建Statement对象,你可以声明它是滚动的。然后,您要做的第一件事就是滚动到结尾并获取记录编号。在查看最后一条记录时,这将是结果集中记录的数量。然后回滚到开始并正常处理。喜欢的东西:

Statement st=connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
ResultSet rs=st.executeQuery(myQueryString); 
boolean any=rs.last(); 
int count = any ? count=getRow() : 0; 
... do whatever with the record count ... 
rs.first(); 
while (rs.next()) 
{ 
... whatever processing you want to do ... 
} 
rs.close(); 
... etc ... 

我不知道用的MS Access这样做对性能的影响将是什么,是否可以直接跳转到结果集的结尾,或者如果它必须顺序读取所有记录。不过,它应该比执行查询两次更快。

+0

我在多个地方找到了这个答案,但是从getRow返回的值是错误的(在成千上万的时候它应该是数百)。而由于某种未知的原因 - 可能存在一些访问问题 - 滚动似乎搞砸了光标。 – 2009-11-10 14:00:30

+0

嗯。我在MySQL和Oracle上多次使用过getRow,它一直运行良好。我想这可能是MS Access或JDBC驱动程序中存在错误。我的第一个想法是做最后一个/ getRow并检查计数,读取该记录中的某个标识字段并将其转储出来,然后先执行,然后循环执行记录计数。如果last/getRow真的说1000,但循环只发现100或其他任何东西,如哇,这是奇怪的。在我总结出这个明显的错误之前,我会进行一些测试以确保它的确信。 – Jay 2009-11-10 17:35:45

相关问题