oracle的rownum顺序,ORACLE数据库中的ROWNUM和ORDER BY执行顺序

本文介绍了在Oracle SQL查询中使用ROWNUM和ORDER BY时的执行顺序,以及它们对查询结果的影响。当ORDER BY字段为主键时,先排序后赋ROWNUM;否则,先赋ROWNUM再排序。为了排除这种影响,可以使用子查询来实现。同时,提到了ROW_NUMBER() OVER函数作为ROWNUM的增强版,可用于更复杂的行号分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



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

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

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

对于上述两种结果需求,编写SQL语句的时候,需要注意ROWNUM赋值和ORDER

BY的执行顺序。如果ORDERBY的基准字段是表的PrimaryKey,则查询执行过程是先对表进行排序,然后为排序后的表视图从第一行到最后一行赋予ROWNUM值。反之,如果ORDERBY的基准字段不是PK,则先从第一行到最后一行为表赋予ROWNUM值,然后进行排序。例如假设存在表TABLE_TEST,其数据如下。

TABLE_TEST

COLUMN_1COLUMN_2COLUMN_3COLUMN_4COLUMN_5

2011Jim010336633Tokyo19911011

2010John010336622Beijing19910609

2012Kate010336611Newark19920821

2013Richard010336644Paris19920115

2014Joseph010336666London19910726

有如下SQL语句查询数据。

SELECT ROWNUM, COLUMN_1, COLUMN_2

FROM TABLE_TEST

WHERE ROWNUM < 3

ORDER BY COLUMN_1 DESC;

那么,如果

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

ROWNUMCOLUMN_1COLUMN_2

12014Joseph

22013Richard

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

ROWNUMCOLUMN_1COLUMN_2

22011Jim

12010

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 <=2

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值