码迷,mamicode.com
首页 > 其他好文 > 详细

使用order by和rownum时特别注意

时间:2016-02-25 11:45:18      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

当使用order by与rownum结合时,请一定保证order by后有一个能保证唯一的列

例如 select t.* from person t order by t.age,t.id; //id为主键,age可能重复

 

如果不这么写,将会产生如下问题:

1,首先创建表:

create table A_LXZ (id int ,name VARchar2(10),age int)

2,插入数据:

insert into A_LXZ(id,name,age)values(1,a,3);
insert into A_LXZ(id,name,age)values(2,b,4);
insert into A_LXZ(id,name,age)values(3,c,5);
insert into A_LXZ(id,name,age)values(4,d,6);
insert into A_LXZ(id,name,age)values(8,h,7);
insert into A_LXZ(id,name,age)values(9,i,7);
insert into A_LXZ(id,name,age)values(6,f,7);
insert into A_LXZ(id,name,age)values(5,e,7);
insert into A_LXZ(id,name,age)values(7,g,7);
insert into A_LXZ(id,name,age)values(10,j,8);
insert into A_LXZ(id,name,age)values(11,k,9);

 

3,查询结果:

技术分享

4,使用order by age查询结果

技术分享

5,使用order by + rownum 获取前面的N条结果时,结果如下

技术分享

到这里,问题就出来了,ID为7的数据去了哪里? 本来想要得到的结果集是这样的:

技术分享

却得到了这样

技术分享

 

原因是:

当order by 排序后遇到相同的数据时,rownum的确定是无序排列(不稳定排序),

比如打印出rownum的值:

技术分享

可以看到id=7的rownum是9,所以我们获取rownum<=8时,是获取不到id=7的数据的,所以看到的和真正获取到的可能不一致.

 

由此得出结论,当我们使用order by和rownum的时候,请保证order by 后至少有一个列是具有唯一值的.

例如:

技术分享技术分享

这样数据就能够保证查询与获取是一致的了.

 

使用场景:

解决查询列表的全部显示,与分页显示,显示的数据不一致.

 

使用order by和rownum时特别注意

标签:

原文地址:http://www.cnblogs.com/qinggege/p/5216150.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!