经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
Oracle 分页查询与数据去重
来源:cnblogs  作者:ki16  时间:2019/4/30 8:43:28  对本文有异议

1.rownum字段

Oracle下select语句每个结果集中都有一个伪字段(伪列)rownum存在。
rownum用来标识每条记录的行号,行号从1开始,每次递增1。
rownum是虚拟的顺序值,前提是先排序


使用rownum需注意:
1.rownum的是在取数据的时候产生的序号 。当rownum和order by一起使用时,会首先选出符合rownum条件的记录,然后再进行排序。
2.rownum在过滤时只能使用:<,<= 。rownum在过滤完之后会重新排行号,如果是romnum>n的话,过滤掉不满足条件的,重新排又从1开始还是不满足条件,再过滤最终会把所有数据都过滤掉

2.分页查询

  1. --top n
  2. --查询工资排名前五的员工信息

 --思路:先按工资进行排序,再根据行号过滤留下前5条记录
 --因为SQL语句的执行顺序是先执行select返回查询结果(行号在此时排好)再进行排序
 --所以先需要用子查询,返回排好序的查询结果

  1. select t.* ,rownum from
  2. (select * from emp order by sal desc)t
  3. where rownum<=5;
  4. --分页查询
  5. --查询工资排名6~10的员工信息

 --思路:因为过滤完rownum字段也会随之变化,所以rownum不能使用大于号判断
 --所以还是要用子查询先把行号排好定下来(需要用别名与外层查询的rownum区分开来)

  1. select * from
  2. (select t.*, rownum rown
  3. from
  4. (select * from emp order by sal desc) t) where rown>5 and rown<=10;

 

 

3.rowid

rowid 是Oracle中每个表都有的一个实际存在的一个值,rowid的值是唯一的

4.数据去重

  1. --先创建一张表往里面插入几条相同的数据
  2. create table test01(id number(3),name varchar2(10))
  3. insert into test01 values(123,'张三');
  4. insert into test01 values(124,'李四');
  5. insert into test01 values(125,'王五');
  6. insert into test01 values(126,'张三');
  7. insert into test01 values(127,'张三');
  8. insert into test01 values(128,'李四');
  9. insert into test01 values(129,'张三');
  10. --数据去重
  11. --思路:重复项进行分组,获取每一组最小(或最大)的rowid,删除不在此列的数据
  12. delete from test01 where rowid not in(
  13. (select min(rowid) from test01 t group by name)
  14. );

去重前       

 

原文链接:http://www.cnblogs.com/gaojinshun/p/10745242.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号