【问题标题】:Getting Number of Rows in a Group By Query with Microsoft Access使用 Microsoft Access 通过查询获取组中的行数
【发布时间】:2010-12-14 18:11:55
【问题描述】:

我在this 问题中概述了基本相同的问题,但是我使用 Microsoft Access 作为数据库而不是 MySQL。结果是我似乎无法使用 SQL_CALC_FOUND_ROWS。相信我,我想换,但目前是不可能的。

我有一个聚合多个行的查询,本质上是使用 group by 根据某些键查找重复行。它看起来像这样:

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

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

数据库是通过 Java 访问的,所以理论上我可以简单地运行查询,然后循环两次,但我希望更快,最好是基于 SQL 的。有什么想法吗?

【问题讨论】:

    标签: java sql ms-access jdbc


    【解决方案1】:

    MS Access 的记录数应该可以满足您的需求,还是我遗漏了什么?

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

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

    【讨论】:

    • 数据库正在通过 Java 访问,但我猜 Java 有一个 RecordCount 的等价物
    • 您能详细说明一下吗?如何查看记录数?请注意,我是通过 Java 而不是 Access 前端访问它...
    • @Andomar 不,它没有。无法从 Java ResultSet 对象中获取记录计数。
    • 这个答案与运行两次查询有何不同?
    • @David 它运行了两次查询,但第二次只包含我需要的答案。它在 SQL 中运行了两次。当我说运行它两次时,我的意思是运行原始查询,然后一直滚动它的行(可能是数千甚至数百万)两次。我真的宁愿避免。我宁愿让 SQL 来计算,因为它可能会比 Java 更快。这正是这个答案的作用。
    【解决方案2】:

    当您创建 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 执行此操作会对性能产生什么影响,它是否可以直接跳转到结果集的末尾,或者它是否必须按顺序读取所有记录。不过,它应该比执行两次查询要快。

    【讨论】:

    • 我在多个地方找到了这个答案,但是从 getRow 返回的值是错误的(应该是数百个)。由于一些未知的原因——可能是一些访问问题——滚动似乎搞砸了光标。
    • 嗯。我已经多次在 MySQL 和 Oracle 中使用 getRow 并且它总是运行良好。我想这可能是 MS Access 或 JDBC 驱动程序中存在错误。我的第一个想法是执行 last/getRow 并检查计数,读取该记录中的一些识别字段并将其转储,然后首先执行并循环记录计数。如果 last/getRow 真的说 1000 但循环只找到 100 或其他什么,就像哇,那很奇怪。在我断定这是一个明显的错误之前,我会进行一些测试以非常确定。
    猜你喜欢
    • 2020-06-02
    • 1970-01-01
    • 2013-06-21
    • 2010-11-10
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多