Welcome 微信登录

首页 / 数据库 / MySQL / Oracle数据库中的ROWNUM和ORDER BY执行顺序

使用SQL查询Oracle表数据的时候,可能会有如下两种结果需求。对查询结果集排序,并获得其排序前的行号对结果集排序后,为每一行加入行号对于上述两种结果需求,编写SQL语句的时候,需要注意ROWNUM赋值和ORDER BY的执行顺序。如果ORDERBY的基准字段是表的PrimaryKey,则查询执行过程是先对表进行排序,然后为排序后的表视图从第一行到最后一行赋予ROWNUM值。反之,如果ORDERBY的基准字段不是PK,则先从第一行到最后一行为表赋予ROWNUM值,然后进行排序。例如假设存在表TABLE_TEST,其数据如下。TABLE_TESTCOLUMN_1            COLUMN_2            COLUMN_3            COLUMN_4            COLUMN_5 2011                          Jim                     010336633           Tokyo                       199110112010                            John                   010336622           Beijing                       199106092012                            Kate                   010336611           Newark                        199208212013                            Richard             010336644           Paris                           199201152014                            Joseph               010336666           London                        19910726有如下SQL语句查询数据。SELECT ROWNUM, COLUMN_1, COLUMN_2FROM TABLE_TESTWHERE ROWNUM < 3ORDER BY COLUMN_1 DESC;那么,如果COLUMN_1为表的主键,则查询结果为ROWNUM     COLUMN_1            COLUMN_21                         2014                        Joseph2                         2013                        RichardCOLUMN_1不是表的主键,则查询结果为ROWNUM     COLUMN_1            COLUMN_22                          2011                          Jim1                          2010                          John从上述例子中可以看出根据排序列是否为主键,对排序和ROWNUM的影响。对于文章最开始的两种情况,如果我们需要排除因为排序字段主键与否对执行顺序的影响。可以分别采用如下的查询方式。SELECT*FROM (     SELECT           ROWNUM            , COLUMN_1            , COLUMN_2                    FROMTABLE_NM      )ORDER BY COLUMN_1        b.  SELECTROWNUM, A.*           FROM (                   SELECT COLUMN_1 , COLUMN_2                   FROMTABLE_NM                   ORDERBY COLUMN_1          )  A利用上述方式,虽然那效率上不如非嵌套查询,但能达到我们的查询需求。测试版本:ORACLE 11g Release 11.2 另外从ORACLE 9i开始加入的ROW_NUMBER() OVER函数,在排序关系上和ROWNUM一致,但它比ROWNUM多了一些功能,它可以帮助实现最后若干行的操作。例如SELECT *FROM (SELECTA.*,ROW_NUMBER()OVER(PARTITION BY TRUNC(COLUMN_1)ORDERBY COLUMN_1 DESC) AS ROW_NUM                  FROMTABLE_NM A)WHERE ROW_NUM <=2Oracle中先ORDER BY再ROWNUM    http://www.linuxidc.com/Linux/2012-02/54525.htm更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址