欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Oracle数据库的分页,删除重复数据

程序员文章站 2022-06-02 16:49:20
...

oracle如何实现分页?

1. rownum

oracle有伪列 rownum , 这个列并不是我们定义的列, 而是每个表自带的列

它会在查询结果出来后, 从1开始, 向下递增

2. rownum不能采用> 1判断

因为rownum永远都是从1开始生成的, 在判断第一行数据的时候, 就已经判断不成功, 这一条从搜索结果中去除 , 判断下一行, 下一行也是从1开始生成 , 如此反复 , 最终没有一行数据满足要求

3. 实现分页

要实现分页, 需要借助rownum , 但是因为rownum自身的定义, 无法进行大于1的判断

所以需要查询两次, 将第一次查询结果作为一个假表 , 将查出来的rownum, 定一个别名作为序号列

第二次查询对序号列使用between

这里注意 , oracle中别名如果涉及到关键字如row,需要用双引号括起来,并且别名用在其他地方也要双引号

select *
  from (select rownum "row", emp.* from emp) temp
 where "row" between 3 and 5;

oracle去重 使用group by

1. 注意

oracle跟mysql的group by 一个不同点是 , mysql不管group by 哪几列, 都可以查询其他列 , 比如

select * from repe group by name,age;

但是oracle的group by , select只能是分组的列, 以及函数,比如

select name,age from repe group by name,age;

或者

select max(id),name ,age from repe group by name,age;

2. 查询重复数据

repe表中, 有三列: id , name , age
数据如下:

重复的是id为1,2的aa, 以及5,6的cc

id name age
1 aa 18
2 aa 18
3 bb 19
4 bb 20
5 cc 17
6 cc 17
select min(id),name,age
  from repe
 group by name,age
having count(1) > 1

删除重复数据 , 选择留下id小的

delete repe where id not in(
-- 分组后,查最小的id , 也就是去重后的数据
select min(id)
  from repe
 group by name,age
)

这里mysql会报错, 因为删除了子查询的数据,一边查一边删
这里要加一层查询

delete repe where id not in(
    --加一层查询
    select min from(
        -- 分组后,查最小的id , 也就是去重后的数据
        select min(id) min
          from repe
         group by name,age
    )
)
相关标签: oracle 分页