使用 Oracle,您始终可以使用分析函数来计算即将返回的确切行数。这是此类查询的示例:
SELECT inner.*, MAX(ROWNUM) OVER(PARTITION BY 1) as TOTAL_ROWS
FROM (
  [... your own, sorted search query ...]
) inner
这将为您提供特定子查询的总行数。当您还想应用分页时,您可以进一步包装这些 SQL 部分:
SELECT outer.* FROM (
  SELECT * FROM (
    SELECT inner.*,ROWNUM as RNUM, MAX(ROWNUM) OVER(PARTITION BY 1) as TOTAL_ROWS
    FROM (
      [... your own, sorted search query ...]
    ) inner
  ) 
  WHERE ROWNUM < :max_row
) outer
WHERE outer.RNUM > :min_row
用有意义的值替换min_row和max_row。但请注意,当您不使用索引进行过滤或对索引进行相对较窄的操作时,计算确切的行数可能会很昂贵。在此处阅读有关此内容的更多信息:Oracle 中分页查询的速度UNIQUE SCANRANGE SCAN
正如其他人所说,您始终可以有一个绝对上限,例如使用过滤器5000对您的查询进行ROWNUM <= 5000筛选,然后只表明有多个5000+结果。ROWNUM请注意,当您应用过滤时,Oracle 可以非常擅长优化查询。在此处查找有关该主题的一些信息:
http://www.dba-oracle.com/t_sql_tuning_rownum_equals_one.htm