oracle中如何通过rownum实现删除多行数据实操

4 篇文章 0 订阅
1 篇文章 0 订阅

最近碰到一个关于oracle的问题,我想要删除指定行数的多行数据,这个多行指的是select * from tablename时的行。这时我想到伪列rownum,信息如下:
表:sc ; 复合主键:sno,cno ;想要删除第8行以后的数据(cno是汉字的)。
在这里插入图片描述

于是我潇洒的写出了这样一句:
delete from sc where (sno,cno) in (select sno,cno from(select s.,rownum rn from sc s) where rn >8);
结果如下:
在这里插入图片描述
发现前面的第4行和第7行也被删除了,而且后面想删除的数据并未删除干净,后来才发现select sno,cno from(select s.
,rownum rn from sc s) where rn >8并不是之前那几行带汉字的,主要原因是select sno,cno时是先排序(好像是隐藏了order by sno,cno)再选取rownum大于8的数据,结果就是第4行数据排到了后面,显然并不是我要的结果。

于是我进行了改进,也是勉强完成了任务;改进就是选取所有的列,不包括rownum,所以我得一一列出那些列,但是还好只有三列。首先我们回滚数据,因为是navicat,好像并未有回滚功能,因此只能下面这个方法:
select * from sc as of timestamp to_timestamp(‘2018-12-21 16:15:00’,‘yyyy-mm-dd hh24:mi:ss’);
alter table sc enable row movement;
flashback table sc to timestamp to_timestamp(‘2018-12-21 16:15:00’,‘yyyy-mm-dd hh24:mi:ss’);
alter table sc disable row movement;

分别是 查看某个时间点表的数据情况;开启回闪;回闪到某个时间点;关闭回闪;
然后利用改进的语句继续执行:
delete from sc where (sno,cno,score) in (select sno,cno,score from(select s.*,rownum rn from sc s) where rn >8);
结果如下:
在这里插入图片描述
这边可以看到看到我想要删除的cno字段是汉字的数据都已不见,说明达到要求,但是假如一个表有50个字段怎么办,我不可能一一列出来吧,所以肯定是要优化的,但是目前还没找到更好的方法,暂时忍着吧~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值