使用 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 SCAN
RANGE SCAN
正如其他人所说,您始终可以有一个绝对上限,例如使用过滤器5000
对您的查询进行ROWNUM <= 5000
筛选,然后只表明有多个5000+
结果。ROWNUM
请注意,当您应用过滤时,Oracle 可以非常擅长优化查询。在此处查找有关该主题的一些信息:
http://www.dba-oracle.com/t_sql_tuning_rownum_equals_one.htm