Oracle数据库。。表结构如下:
id 创建日期 修改日期 是否置顶
news_id cre_date upd_date is_top
1 2011-03-18 08:14:02 2011-03-18 08:14:02 0
2 2011-03-18 08:15:42 2011-03-18 08:15:42 0
3 2011-03-18 08:22:18 2011-03-18 08:22:18 1
4 2011-03-18 08:44:30 2011-03-18 08:44:30 1要求:
is_top按照时间倒序显示在最前面,
upd_date按时间倒序显示在is_top的下面。显示格式如下:
id 创建日期 修改日期 是否置顶
news_id cre_date upd_date is_top
4 2011-03-18 08:44:30 2011-03-18 08:44:30 1
3 2011-03-18 08:22:18 2011-03-18 08:22:18 1
2 2011-03-18 08:15:42 2011-03-18 08:15:42 0
1 2011-03-18 08:14:02 2011-03-18 08:14:02 0
id 创建日期 修改日期 是否置顶
news_id cre_date upd_date is_top
1 2011-03-18 08:14:02 2011-03-18 08:14:02 0
2 2011-03-18 08:15:42 2011-03-18 08:15:42 0
3 2011-03-18 08:22:18 2011-03-18 08:22:18 1
4 2011-03-18 08:44:30 2011-03-18 08:44:30 1要求:
is_top按照时间倒序显示在最前面,
upd_date按时间倒序显示在is_top的下面。显示格式如下:
id 创建日期 修改日期 是否置顶
news_id cre_date upd_date is_top
4 2011-03-18 08:44:30 2011-03-18 08:44:30 1
3 2011-03-18 08:22:18 2011-03-18 08:22:18 1
2 2011-03-18 08:15:42 2011-03-18 08:15:42 0
1 2011-03-18 08:14:02 2011-03-18 08:14:02 0
select *
from tb
order by is_top desc,upd_date desc
(select * from vw_news where cate_id=1 order by is_top desc,upd_date desc)
where rownum <= 10;原因:
要注意的是:在使用ROWNUM 时,只有当Order By 的字段是主键时,查询结果才会先
排序再计算ROWNUM,下面OBJECT_ID 是表T_TEST1 的主键字段:
但是,对非主键字段OBJECT_NAME 进行排序时,结果就混乱了:
出现这种混乱的原因是:Oracle 先按物理存储位置(rowid)顺序取出满足rownum 条
件的记录,即物理位置上的前5 条数据,然后在对这些数据按照Order By 的字段进行排
序,而不是我们所期望的先排序、再取特定记录数。
如果需要对非主键字段排序再去前n 条数据,我们可以以以下方式实现:
SQL> select object_id,object_name
2 from (select object_id,object_name from t_test1
3 order by object_name)
4 where rownum <= 5;
OBJECT_ID OBJECT_NAME
---------- ------------------------------
35489 /1000e8d1_LinkedHashMapValueIt
35490 /1000e8d1_LinkedHashMapValueIt
21801 /1005bd30_LnkdConstant
21802 /1005bd30_LnkdConstant
17205 /10076b23_OraCustomDatumClosur在网上找的一个关于Oracle中rownum的用户的文档。