需求: 项目中有一张表大概有7000多万条数据,造成表空间已满,需要清理部分数据,打算清理3000万. 2B 做法: delete from table_name where ID > '40000000'; 备注:select count(1) from table_name where ID > 'his_batch_4000000'; 的结果大概有3000万条数据. 影响: 删了N个小时也没执行完,最终强制停止,造成表被锁.(没有管理员权限,需要联系DBA 才能解锁) 改进: decl
1.找出重复数据 select count(1),uuid from ts.test group by uuid having count(1)>1 order by 1 desc ;---找出重复数据 select * from ts.test E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM ts.test x WHERE X.UUID=E.UUID AND E.TRAN_DT=X.TRAN_DT);---找出重复数据 2.删除重复数据 delete
-- 如表role_user的数据 ROLEID USERID -- 删除相同记录只剩下一条记录 根据两个字段查询重复数据 (roleid,userid) ) 删除重复数据只保留一条 delete from role_user where rowid not in (select min(rowid) from role_user group by roleid , userid ) 下面的只根据userid进行查询与删除 ),USERID ) ) );
查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 where Id in (select Id from 表 group byId having count(Id) > 1) 2.删除表中多余的重复记录,重复记录是根据单个字段(Id)来判断,只留有rowid最小的记录 DELETE from 表 WHERE (id) IN ( SELECT id FROM 表 GROUP BY id HAVING C
删除重复记录,利用ROWID 和MIN(或MAX)函数, ROWID在整个数据库中是唯一的,由Oracle自己产生和维护,并唯一标识一行(无论该表中是否有主键和唯一性约束),ROWID确定了每条记录在哪个数据文件.哪个块上. 利用not in: delete from manager where ROWID NOT IN( select MIN(ROWID) from manager group by mgrno); 删除之前的数据: SQL> select * from manager; M
转自:http://www.cnblogs.com/252e/archive/2012/09/13/2682817.html 查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 where Id in (select Id from 表 group byId having count(Id) > 1) 2.删除表中多余的重复记录,重复记录是根据单个字段(Id)来判断,只留有rowid最小的记录 DELE
数据库操作中,经常会因为导数据造成数据重复,需要进行数据清理,去掉冗余的数据,只保留正确的数据 一:重复数据根据单个字段进行判断 1.首先,查询表中多余的数据,由关键字段(name)来查询. select * from table_name where name in (select name from table_name group by name having count(name)>1) 2.删除表中重复数据,重复数据是根据单个字段(name)来判断,只留有rowid最小的记录
1.有可区分的主键,其他数据相同 select * from 表名 dl where dl.id not in (select min(d.id) from 表名 d group by 重复列) 2.重复数据只能通过RowNum.RowId区分的数据 select * from 表名 where rowid in(select max(rowid) from 表名 d group by d.id,d.wareh_id,d.wareh_name having count(wareh_id)>1
比如,某个表要按照id和name重复,就算重复数据 delete from 表名 where rowid not in (select min(rowid) from 表名 group by id,name); commit; 如果以id,name和grade重复算作重复数据 delete from 表名 where rowid not in (select min(rowid) from 表名 group by id,name,grade); commit; 注意 min也可以换成max
select id from LOG where created >= to_date('2015/2/7 00:00:00', 'yyyy-mm-dd hh24:mi:ss') and created <= to_date('2015/2/8 18:00:00', 'yyyy-mm-dd hh24:mi:ss') group by id delete from LOG where id in (SELECT id FROM LOG ) );
去重 第一种:distinct create table tmp_t3 as select distinct * from t3; drop table t3; alter table tmp_t2 rename to t3; -- 第二种,用rowid delete from t2 where rowid <>( select min(rowid) from t2 b where b.c1 = t2.
//显示重复的所有条 SELECT * FROM 表名 WHERE (字段1,字段2,...) IN (SELECT 字段1,字段2,...FROM 表名 GROUP BY 字段1,字段2,... HAVING COUNT(*)>1) //只显示重复中的一条 SELECT * FROM 表名 GROUP BY CONCAT(字段1,字段2,...) HAVING COUNT(*)>1 //删除重复数据(保留ID最小的一条) DELETE FROM 表名 WHERE (字段1,字段2,...)
在开发阶段往Oracle数据库中多个表格中导入了许多测试数据,倘若一张张表执行"truncate table tablename"语句显得十分繁琐.在PL/SQL中可以用代码进行批量删除表格数据.代码如下: declare cursor c_t is (select table_name from user_tables where table_name like 'D%');--声明一个游标 table_name user_tables.table_name%type;--声明一个表