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)
好长的 sql 语句啊
是不是问怎么改的更快并实现同样的功能?
如果这个表行数很多并且日期时间这一列的值范围比较大时,“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)
)
我里面放了一个类似的,可以凑合看看、