首页 新闻 会员 周边 捐助

删除重复记录

0
[待解决问题]

use ESIMS
delete from 数据记录表
where 物料编号=50 and 成分编号=4 and 日期时间>='2013/2/26' and 日期时间<'2013/2/27' and 日期时间 in (select 日期时间 from 数据记录表 group by 日期时间 having count(日期时间) > 1)
and ID not in (select min(ID) from 数据记录表 where 物料编号=50 and 成分编号=4 group by 日期时间 having count(日期时间)>1) and ID not in (select min(ID) from 数据记录表 where 物料编号=50 and 成分编号=4 group by 日期时间 having count(日期时间)=1)

C#
winzys的主页 winzys | 菜鸟二级 | 园豆:202
提问于:2013-02-26 15:28
< >
分享
所有回答(3)
0

好长的 sql 语句啊

jerry-Tom | 园豆:4077 (老鸟四级) | 2013-02-26 18:09
0

是不是问怎么改的更快并实现同样的功能?

如果这个表行数很多并且日期时间这一列的值范围比较大时,“select 日期时间 from 数据记录表 group by 日期时间 having count(日期时间) > 1”这样的查询很费时间。

1.最简单的改法(表10000行左右,预计缩短一半的查询时间)

在每个子查询上加上日期时间的条件,可能是像下面这样(思路,不保证能直接执行)

use ESIMS
delete from 数据记录表
where 物料编号=50 and 成分编号=4 and 日期时间>='2013/2/26' and 日期时间<'2013/2/27' and 日期时间 in (select 日期时间 from 数据记录表 where 日期时间>='2013/2/26' and 日期时间<'2013/2/27'  group by 日期时间 having count(日期时间) > 1) 
and ID not in (select min(ID) from 数据记录表 where 物料编号=50 and 成分编号=4 and 日期时间>='2013/2/26' and 日期时间<'2013/2/27'  group by 日期时间 having count(日期时间)>1) and ID not in (select min(ID) from 数据记录表 where 物料编号=50 and 成分编号=4 and 日期时间>='2013/2/26' and 日期时间<'2013/2/27'  group by 日期时间 having count(日期时间)=1)

2 假设ID是主键,可以这样(思路,不保证能直接执行)

use ESIMS
delete from 数据记录表 

where id IN (

select A.ID from 数据记录表 A,(select min(ID),日期时间 where 日期时间>='2013/2/26' and 日期时间<'2013/2/27'  group by 日期时间 having count(日期时间) > 1 ) B

where not exists (select 'x' from B where A.id = B.id)

)

碧落星痕 | 园豆:708 (小虾三级) | 2013-02-26 20:53
0

我里面放了一个类似的,可以凑合看看、

淘果果 | 园豆:202 (菜鸟二级) | 2013-02-27 13:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册