可以通过查询结果获取结果集行数吗?

Posted

技术标签:

【中文标题】可以通过查询结果获取结果集行数吗?【英文标题】:Possible to get resultset rowcount with query results? 【发布时间】:2009-10-28 18:18:49 【问题描述】:

目前我需要运行两个查询来获取结果集中的项目总数以及结果集中。是否有可能一次性获得结果集计数以及结果集到数据库。我正在尝试优化我的代码,因此我不必对数据库进行 2 次传递,因为这些单独的选择语句已经需要几分钟才能运行。我正在寻找 oracle sql 和 ms sql 的解决方案,因为我两者都使用。我还使用 Microsoft 的 Oracle 访问库来访问 Oracle 数据库,而不是 Oracle 访问库。

【问题讨论】:

【参考方案1】:

根据您的 Oracle 版本,您可以使用分析函数 count() 返回包含总行数的列。

http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/functions032.htm#i82697

select a.*,
       count(*) over() totalRows
  from table1 a;

【讨论】:

好建议。但是,您将如何使用 OracleDataReader 读出该列?使用方法 GetInt32 实际上会引发 InvalidCastException。 它只是查询的附加列(类似于 count(*)),因此您可以像任何其他别名数字列一样输出它。 其实我发现它在使用Convert.ToInt32(reader.GetDecimal(index))时有效【参考方案2】:

OracleCommand 或 oracleDataReader 没有显示提取行的属性。取完所有行后,行数就知道了。

但是如果您将所有数据提取到结果集中,则如上所述,您在resultset.Tables[0].Rows.Count 中拥有行数。这对数据库没有额外成本,因为 Count 是行集合的属性。索引号取决于结果集中的表格数量。

【讨论】:

【参考方案3】:

好的,这可能就是您所追求的: @@ROWCOUNT

它返回受用户上次数据库操作影响的行数。所以你不需要添加一列或做另一遍,只需做查询然后询问@@ROWCOUNT:

将@@ROWCOUNT 选择为“Rows_Returned”

编辑:

这仅适用于 SQL 服务器。对于 Oracle,使用 SQL%Rowcount

希望对你有帮助

【讨论】:

对 SQL Server 有效;该问题已标记为 Oracle。你会为 Oracle 使用 SQL%ROWCOUNT... 其实OP是在追求SQL Server AND Oracle的解决方案,【参考方案4】:

如果您正在迭代结果集,是否可以在每次迭代中增加一个计数器?

一种策略可能是添加一列count(*) as RESULTSET_SIZE

【讨论】:

这也是我能想到的唯一解决方案,但我想知道是否有可以使用的方法或其他策略。如果没有更好的替代解决方案,我会将其标记为解决方案。

以上是关于可以通过查询结果获取结果集行数吗?的主要内容,如果未能解决你的问题,请参考以下文章

select * from user limit 0, 10;

oracle 结果集行转列,多行数据转为一行显示,第一列内容拼接生成字段名

如何将结果集行作为索引子数组添加到结果数组中?

前端可以用js获取textarea中当前光标位置的行数吗?

没有结果集对象时获取受影响的行数

存储在 hashMap 中的结果集给出零行数