1. 养乐多|杨城的个人博客首页
  2. 技术杂谈
  3. Data Analysis

ORACLE查询时ROWNUM和ORDER BY使用技巧

oracle查询语句中在使用ROWNUM时,只有当Order By的字段是主键时,查询结果才会先排序再计算ROWNUM。
下面OBJECT_ID是表T_TEST1的主键字段

sql> SELECT object_id,object_name FROM t_test1 WHERE rownum <= 5 ORDER BY object_id;

 OBJECT_ID OBJECT_NAME
---------- ------------------------------
         2 C_OBJ#
         3 I_OBJ#
         4 TAB$
         5 CLU$
         6 C_TS#

但是,对非主键字段OBJECT_NAME进行排序时,结果就混乱了:

sql> SELECT object_id,object_name FROM t_test1 WHERE rownum <= 5 ORDER BY object_name;

 OBJECT_ID OBJECT_NAME
---------- ------------------------------
        28 CON$
        29 C_COBJ#
        20 ICOL$
        44 I_USER1
        15 UNDO$

出现这种混乱的原因是:oracle先按物理存储位置(rowid)顺序取出满足rownum条件的记录,即物理位置上的前5条数据,然后在对这些数据按照Order By的字段进行排序,而不是我们所期望的先排序、再取特定记录数。

如果需要对非主键字段排序再去前n条数据,我们可以以以下方式实现:

sql> SELECT object_id,object_name FROM (SELECT object_id,object_name FROM t_test1 ORDER BY object_name) WHERE rownum <= 5;

原创文章,作者:iConan,如若转载,请注明出处:https://www.aspyc.com/archives/549.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据