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