Oracle恢复删除数据、根据sql语句
1、一个表中根据以父子级别关系查询显示出来(如图)
select t.* from department t CONNECT BY PRIOR t.depid=t.supdepid ;
--这样也可以,但查出来的结果会有重复
select t.* from department t start with supdepid=0
CONNECT BY PRIOR t.depid=t.supdepid ;--这样就不会了
select t.* from
department t start with supdepid=0 and t.depname like ‘%部%‘ CONNECT
BY PRIOR t.depid=t.supdepid ; --加上其他条件查询
2、显示指定时间的数据库数据
如果你在之前误删了数据信息,但又没有备份,你只需加上要查找的条件,
执行下面的语句,就可以找回误删的信息了
--显示一个小时之前的表数据信息
select * from department as of timestamp sysdate-(1/(24));
--显示90分钟之前的表数据信息
select * from department as of timestamp (systimestamp - interval ‘90‘ minute)
--锁定表格(锁定后,其他人修改表格就会是排队等待状态)
select * from emoloyee for update;
select distinct * from tableName;--查询没有重复的数据
--删除数据库中重复的数据信息
在oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid
下面是查询重复数据的一个例子:
select
a.rowid,a.* from 表名 a
where a.rowid !=
(
select max(b.rowid)
from 表名 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
)
而外面就是查询出除了rowid最大之外的其他重复的数据了。
由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:
delete from 表名 a
where a.rowid
!=
(
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
)
上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。
create table
临时表 as
select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY
a.字段1,a.字段2;
delete from 表名 a
where a.rowid !=
(
select
b.dataid from 临时表 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
);
commit;
关于删除oracle中重复数据的更多信息: http://tech.sina.com.cn/s/2008-11-13/1057873542.shtml
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。