删除脏数据

从cnblogs上看到的一个题目:

二维关系表 T(F1,F2,F3,F4,F5,F6,F7) ,如果 T 表还有一字段 F0 数据类型为自动增量整型(唯一,不会重复),

而且 T 表中含有除 F0 字段外,请删除其它字段完全相同的重复多余的脏记录数据(要保留其中的一条).

(1)delete from T where F0 not in (select max(F0) from T group by F1,F2,F3,F4,F5,F6,F7)

(2)delete T from T a where exists(select 1 from T where F1=a.F1 and F2=a.F2 and

         F3=a.F3 and F4=a.F4 and F5=a.F5 and F6=a.F6 and F7=a.F7 and F0>a.F0)

第一个容易理解,是删除F0中记录小的那些信息,仅保留F0值最大的一条记录.

第二个也指的是删除那些F0记录小的那些信息,保留F0值最大的记录(从语义上进行解释:)

exists(select 1 from T where F1=a.F1 and F2=a.F2 and .... and F0>a.F0)

在T表的记录中,在满足前面七个条件的前提下,存在着比当前a.F0这条记录大的F0的记录.

eg:

F0 F1 F2 F3 F4 F5 F6 F7

1   1    1   1   1  1   1  1

2   1    1   1   1  1   1  1

3   1    1   1   1  1   1  1

此时,delete T from T a where exists(select 1 from T where ... and F0>a.F0)

语句目前定位到第一条,a.F0=1,此时exists语句为True(因为存在着比1大的F0,如2,3,).因此,删除相应的a.F0=1的这条记录.语句定位到第二条的时候,a.F0=2,此时exists语句为True(因为存在着比2大的F0,如3),那么相应的记录也会被删除.

总的来看,第二句可以这样来解释:删除那些在其它条件相同的情况下,F0较小的那些记录.(exists内的语句:存在着比当前记录大的)

 

上次在CSDN上回答的问题,仔细想了想,有些问题

declare @h table(number int,date datetime)
insert into @h
select 123,'20090401' union all
select 123,'20090501' union all
select 123,'20090301' union all   
select 3,'20090601'   union all
select 3,'20090501'

select * from @h

--删除信息中date值最小的那一项(不存在比这条数据还小的记录)
delete @h from @h a where not exists(select 1 from @h where number=a.number and date<a.date)

--删除信息中date值较小的那些项(存在比这条数据大的记录)
delete @h from @h a where exists(select 1 from @h where number=a.number and date>a.date)
select * from @h

 

      我当时回答的是第一条语句,今天一看:如果相同的记录超过二条的时候,只删除日期最小的一条,其实我想问题的实际意思是:保留日期最大的一条记录.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值