博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用order by和rownum时特别注意
阅读量:4538 次
发布时间:2019-06-08

本文共 1353 字,大约阅读时间需要 4 分钟。

起因

  在项目中有用到某表作为数据来源,在页面以列表的形式显示。使用的数据库是Oracle,分页的时候使用到了rownum这个关键字。列表有排序功能,自然也用到了order by。接下来问题出现了,我在用order by查询数据库数据的时候显示的内容,和页面列表处显示的内容竟然不一致。心里想不明白,各种倒腾,终于弄明白了其中一二。

首先说结论:

  当使用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 后至少有一个列是具有唯一值的.

例如:

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

 

使用场景:

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

 

posted on
2016-02-25 10:45  阅读(
...) 评论(
...) 收藏

转载于:https://www.cnblogs.com/qinggege/p/5216150.html

你可能感兴趣的文章
HTML5 20180919
查看>>
后端程序员之路 12、K最近邻(k-Nearest Neighbour,KNN)分类算法
查看>>
缓存技术
查看>>
linux64需要增加的依赖库
查看>>
手机网站页面模板
查看>>
Huffman树与编码的简单实现
查看>>
__delattr__\__delitem__
查看>>
htmlunit简单百度搜索,网页解析
查看>>
Cocos2dx Android在编译的时候格式出错例如(snprintf)
查看>>
spring不同环境下用不同的配置文件
查看>>
数组_leetcode80
查看>>
SQL Error (1130): Host '192.168.1.100' is not allowed to connect to this MySQL server
查看>>
普通线程类获取service,controller等spring容器类
查看>>
Redis高级实践之————Redis短连接性能优化
查看>>
ThreadLocal使用
查看>>
POJ - 2155 Matrix(二维树状数组)
查看>>
基于Cat的分布式调用追踪
查看>>
建筑物联动
查看>>
汇编语言 手记5
查看>>
牛客网暑期ACM多校训练营(第三场) E-Sort String next数组的应用
查看>>