表 table1
字段 id,name,time,column,commnet
记录 1,aaa,111,03,xyz
记录 2,bbb,231,01,xyz
记录 3,aaa,111,03,xyz
记录 4,aaa,111,03,xyz
记录 5,aaa,111,03,xyz
记录 6,aaa,111,03,xyz
记录 7,ccc,111,03,xyz
发现记录1、3、4、5、6是冗余记录
最近发现库中某表有很多这样的冗余记录(比上面例子更严重的情况。恩,1万多条冗余记录-.-')
领导急了!
怎么办?
来,让我们冷静的想一想......
首先,现在我们要查出所有这些捣蛋鬼——冗余记录!
行动起来!先写SQL吧,可能很多朋友立即想到distinct
在此说明一下distinct,他返回的是对象中唯一的记录(如果有表中存在自增字段,那么select distinct * from table与select * from table返回的结果是相同的),而我们需要查询的是出现次数超过1的记录。
我们先要用到having而不是distinct。(至于distinct,后面我们肯定也会用到)
SQL:
2 tmp.prgname, -- 会出现重复的字段
3 tmp.playtime, -- 会出现重复的字段
4 a.prgid, -- 自增标识字段
5 a.prgcolumn, -- 会出现重复的字段
6 a.prgcomment -- 会出现重复的字段
7 from ax_program a
8 left join
9 ( Select
10 prgname,
11 playtime,
12 prgcolumn
13 From ax_program
14 group by prgname,playtime,prgcolumn
15 having count ( * ) > 1 ) -- 加入出现超过1次的限制
16 tmp
17 on
18 a.prgname = tmp.prgname and a.playtime = tmp.playtime
19 where tmp.prgname is not null -- 筛选掉无用记录
20 group by tmp.prgname,tmp.playtime,a.prgcolumn ,a.prgid,a.prgcomment
21 order by tmp.prgname,tmp.playtime
注:select中出现prgid字段纯粹是为了传给程序需要的DataSet作为DataGrid的DataKeyFild用
现在有了查找所有重复记录的SQL,接下来怎么做?
直接删除他们么?
不!那样连想要的记录也一起删掉了,至少要分别保留一条记录!
一条SQL语句恐怕达不到目的。恩,现在需要临时表,然后可以用视图,最好还是写在存储过程里
2 GO
3