【问题标题】:How to execute a group of 'select count(*)' queries as a batch in Java?如何在 Java 中批量执行一组“选择计数(*)”查询?
【发布时间】:2014-01-31 12:07:15
【问题描述】:

编辑:除了 Gordon 的回答,I found this question answered beautifully on this thread

虽然我们可以批量执行一组插入/更新语句,但选择语句没有这样的规定。我知道这样做是不可能的,因为它们返回的结果可能有很多列。

但是,SELECT COUNT(*) FROM table_name 只返回一个值,即整数。有没有办法批量运行一组这样的查询并将结果检索为 int 数组?

我的特殊要求是对同一个数据库上的一堆表运行这些查询,然后对更多数据库重复此操作。考虑这个例子:

    String[] queries = {"SELECT COUNT(*) FROM table1",
                        "SELECT COUNT(*) FROM table2",
                        "SELECT COUNT(*) FROM table3" };
    Statement st = connection.createStatement();
    for(String q: queries){            
           st.addBatch(q);
    }       
    st.executeBatch();

在这种情况下,executeBatch() 命令将只返回受影响的行数,在这种情况下,对于每条语句,这将是零(我想)。

考虑到它们每个只返回一个值,有没有办法制作一批这样的语句?有什么解决方法吗?

具体要求如下..

SQL 过程是毫无疑问的,因为我必须在许多不同的数据库上执行此操作,并且除了读取它们之外我没有任何访问权限。我的意思是,我可以在那里存储过程,但我被告知不要以任何方式修改数据库,而只是从中读取。此外,以后数据库的数量可能会增加,我不会在那里安装这些程序,所以我不希望这种依赖关系使这个解决方案真正灵活。

我正在使用 Java 和 SQL Server 2008 来构建一个网页,该网页从各种数据库上的一堆表中获取计数值并显示它们。

【问题讨论】:

    标签: java sql sql-server sql-server-2008


    【解决方案1】:

    为什么不只运行一个查询?你一个做:

    select (SELECT COUNT(*) FROM table1) as table1cnt,
           (SELECT COUNT(*) FROM table2) as table2cnt,
           (SELECT COUNT(*) FROM table3) as table3cnt;
    

    您也可以每行返回一个值,但您需要一个额外的列来标识表:

    select which, cnt
    from ((SELECT 'table1' as which, COUNT(*) as cnt FROM table1) union all
          (SELECT 'table2' as which, COUNT(*) as cnt FROM table2) union all
          (SELECT 'table3' as which, COUNT(*) as cnt FROM table3)
         ) t
    

    【讨论】:

    • 我认为union 查询可以简化:你不需要外部的select 语句。
    • @ThomasMueller 。 . .这是真的。
    猜你喜欢
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    相关资源
    最近更新 更多