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
)
)
上一篇: 分享14个很酷的jQuery导航菜单插件_jquery
下一篇: Oracle数据库联合主键