使用 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中文网,转载请注明出处,感谢您的尊重!