【问题标题】:How can I perform this query in oracle如何在 oracle 中执行此查询
【发布时间】:2010-08-02 16:33:53
【问题描述】:

能否请您指导我在 Oracle 中与此查询等效:

SELECT SQL_CALC_FOUND_ROWS * FROM tableName 

SELECT FOUND_ROWS() as cnt

谢谢

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    对于 Oracle 9i+,使用:

    SELECT COUNT(*) over () found_rows, 
           t.*
      FROM TABLE t
    

    Be aware that it is faster to run separate queries than to use SQL_CALC_ROUND_ROWS in MySQL.

    【讨论】:

    • 更新提到OVER是一个分析函数,直到9i才支持Oracle。
    【解决方案2】:

    查询从tableName 中检索所有行,然后检索tableName 中的行数。使用SQL_CALC_FOUND_ROWS 这样做只是一种性能优化:它使您免于执行两个查询。

    如果性能不是问题,Oracle 的等价物是:

    SELECT * FROM tableName 
    SELECT count(*) from tableName
    

    如果您有能力重写客户端,您可以在一个查询中完成这两项工作:

    SELECT  *
    ,       (SELECT count(*) from tableName) as totalRows
    FROM    tableName 
    

    【讨论】:

    • 以下 SQL 一次性执行第二个选项:select a.*, count(*) over () as total_rows from [table_name] a;
    • @Adam Musch:一次性完成并不是想象中的那样。在 OP 的版本中,需要对表进行全扫描并对索引进行快速全扫描(假设有一个)。对于您的版本,必须将窗口函数应用于全表扫描的结果。在对超过 900 万行的表进行有限测试时,OP 的版本明显更快(尤其是第一行提示)。
    • @Allan -- 里程数可能总是不同,但最好一次性完成,除非有令人信服的理由(例如,有限的排序内存)不这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2011-07-26
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多