使用 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执行顺序的详细内容...