sql去重复数据

Oracle
oracle数据库使用group by:select中字段必须是group by 后面出现的字段或者是其它字段的聚合函数(Min()、Max()、Sum()、Avg()等函数),即select中的字段不可以单独出现,必须出现在group语句中或者在组函数中。

delete from t_test t1 where t1.id in (
	 select min(t2.id) from t_test t2 
	 where t2.create_dt>trunc(sysdate,'MM')
	 group by t2.access_number having count(t2.access_number)>1);
--其中id是主键

having 子句是对分组之后筛选数据,条件中经常使用聚合函数,而where 子句条件是在group by 分组之前过滤数据,不能包含聚合函数。

mysql
而mysql则没有这么严格的要求,在select中可以是任何字段。

  delete from t_test t1
		left join (select t2.id,t2.name
                from t_test t2
               where t2.create_dt > trunc(sysdate, 'MM')
               group by t2.name
              having count(t2.name) > 1) as t3
        on t1.name = t3.name
  where t1.id > t3.>id;

对于所有字段完全重复的数据去重,可以用distinct

delete from t_test t where t.id in (select distinct(id) from t_test)

当然如果数据量太大,可以创建临时表提高执行效率

1、查询去重数据放到临时表

CREATE TABLE 临时表 AS (select distinct * from 表名);

2、delete重复的正式表

delete from   正式表;

3、去重后的临时表数据插入新的正式表
insert into 正式表 
  (select * from 临时表);

4、drop临时表  
drop table 临时表;

你可能感兴趣的:(Oracle,mysql)