好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

ORACLE数据库中的ROWNUM和ORDERBY执行顺序

使用 SQL 查询 ORACLE 表数据的时候,可能会有如下两种结果需求。 对查询结果集排序,并获得其排序前的行号 对结果集排序后,为每一行加入行号 对于上述两种结果需求,编写 SQL 语句的时候,需要注意 ROWNUM 赋和 ORDER BY 的执行顺序。如果 ORDERBY 的基准



使用 SQL 查询 ORACLE 表数据的时候,可能会有如下两种结果需求。

对查询结果集排序,并获得其排序前的行号

对结果集排序后,为每一行加入行号

对于上述两种结果需求,编写 SQL 语句的时候,需要注意 ROWNUM 赋值和 ORDER BY 的执行顺序。如果 ORDERBY 的基准字段是表的 PrimaryKey ,则查询执行过程是先对表进行排序,然后为排序后的表视图从第一行到最后一行赋予 ROWNUM 值。反之,如果 ORDERBY 的基准字段不是 PK ,则先从第一行到最后一行为表赋予 ROWNUM 值,然后进行排序。例如假设存在表 TABLE_TEST ,其数据如下。

TABLE_TEST

COLUMN_1 COLUMN_2 COLUMN_3 COLUMN_4 COLUMN_5

2011 Jim 010336633 Tokyo 19911011

2010 John 010336622 Beijing 19910609

2012 Kate 010336611 Newark 19920821

2013 Richard 010336644 Paris 19920115

2014 Joseph 010336666 London 19910726

有如下 SQL 语句查询数据。

SELECT ROWNUM, COLUMN_1, COLUMN_2

FROM TABLE_TEST

WHERE ROWNUM

ORDER BY COLUMN_1 DESC;

那么,如果

COLUMN_1 为表的主键,则查询 结果为

ROWNUM COLUMN_1 COLUMN_2

1 2014 Joseph

2 2013 Richard

COLUMN_1 不是表的主键,则查询 结果为

ROWNUM COLUMN_1 COLUMN_2

2 2011 Jim

1 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

查看更多关于ORACLE数据库中的ROWNUM和ORDERBY执行顺序的详细内容...

  阅读:63次