用sql语句在一个表中删除重复记录
情况如下:表中有条六条记录。 其中张三和王五 的记录有重复
TableA
id customer PhoneNo
001 张三 777777
002 李四 444444
003 王五 555555
004 张三 777777
005 张三 777777
006 王五 555555
如何写一个sql语句将TableA变成如下
001 张三 777777
002 李四 444444
003 王五 555555
问题点数:20、回复次数:17Top
1 楼filebat(Mark)回复于 2005-08-22 21:27:32 得分 1
--假定id为主键
delete tablea
where not exists(
select 1
from tablea as tt
where customer=tt.customer
and phoneno=tt.phoneno
and id<tt.id)Top
2 楼MorningTea(一勺抹茶)回复于 2005-08-22 21:38:14 得分 0
1.方法一
可以不用语句
假设原来的表为TableA,customer重复则为重复,需要保留一笔即可
建立一张具有和TableA相同结构的临时表myTableA,单击鼠标右键,选择所有任务,选择管理索引,选择新建,起个索引名字,列就是customer,建立一个索引,勾选上唯一(unique),勾选上忽略重复的值,其他不要选择!然后把资料insert into到临时表,
此时SQL Server会返回如下提示:
服务器: 消息 3604,级别 16,状态 1,行 1
已忽略重复的键。
它表明在产品信息临时表myTableA中不会有重复的行出现。
然后将原表TableA清空,并将临时表myTableA中数据导入,最后删除临时表myTableA。
这样就完成了对表中重复记录的删除。该方法的执行速度都是相当快的,而且因为几乎不用写语句,所以它也是很安全的。不过要依靠你的customer,万一你操作不当,没有关系,不要那么急着删除原来的表,这样不会出什么异常,错删除纪录!
2.如果你是认为要customer PhoneNo2个子段相同才认为是重复,那么你就是组合字段为主键,方法也是如上
3.如果非要用语句,用 filebat(Mark) 的,因为你要key 值,如果没有就自己造一个,用identity(data_type,seed,increment),select到一个临时表,然后删除重复的,然后删除原表所有,然后插入即可,这里不写,何必舍近求远呢
FYI
Top
3 楼filebat(Mark)回复于 2005-08-22 21:41:24 得分 0
呵呵, 一直想知道 MorningTea(一勺抹茶)是GG还是MM。
可以小声答一句不?
讲得好仔细哦。Top
4 楼vivianfdlpw()回复于 2005-08-22 21:45:34 得分 1
delete TableA
from TableA t
where exists(select 1 from TableA where customer=t.customer and id<t.id)Top
5 楼zlp321002(Life Is Good,Let's Shine)回复于 2005-08-22 21:48:09 得分 16
--测试环境
create table TableA ( id varchar(3),customer varchar(5),PhoneNo varchar(6))
insert into TableA select '001','张三','777777'
union all select '002','李四','444444'
union all select '003','王五','555555'
union all select '004','张三','777777'
union all select '005','张三','777777'
union all select '006','王五','555555'
--删除语句
delete from TableA
where id not in
(select id=min(id) from TableA
group by customer,PhoneNo
)
--结果 select * from TableA
id customer PhoneNo
---- -------- -------
001 张三 777777
002 李四 444444
003 王五 555555
(所影响的行数为 3 行)
Top
6 楼tntzbzc(华裔大魔王—抗日要从娃娃抓起)回复于 2005-08-22 21:48:39 得分 0
搂主多用用搜索功能:)Top
7 楼zlp321002(Life Is Good,Let's Shine)回复于 2005-08-22 21:51:26 得分 0
-- filebat(Mark) 的语句是错的!!Top
8 楼zlp321002(Life Is Good,Let's Shine)回复于 2005-08-22 21:54:51 得分 1
--filebat(Mark) 应该这样
delete tablea
from tablea tt
where exists(
select 1
from tablea
where customer=tt.customer
and phoneno=tt.phoneno
and id<tt.id)Top
9 楼yuchuanbo(xiaoyu)回复于 2005-08-22 21:56:07 得分 0
delete a from TableA a join TableA b on a.id = b.id where a.id>b.id
Top
10 楼MorningTea(一勺抹茶)回复于 2005-08-22 22:01:14 得分 0
1.cpucontrol (可以包含) ,你用我的第一种方法,速度贼快,我试了可以,如果不行,我明天做个图示你照着做,速度可以,其他说的方法都是可以,你用csdn全论坛搜索查,都是差不多这种方法,但是有个缺点就是速度慢,几笔还无所谓,实际用到生产当中,速度不是很优秀,我说的第一种非常快,因为我是请微软的系统自动帮我做啊!--我刚才试的大概有3000笔纪录左右,速度很快,几乎不用5秒,删除重复的剩下大概有1500左右
2.回复人: filebat(Mark) ( ) 信誉:100 2005-08-22 21:41:00 得分: 0
呵呵, 一直想知道 MorningTea(一勺抹茶)是GG还是MM。
可以小声答一句不?
讲得好仔细哦。
反正我不是GG或者MM,总之我不是阴阳人啦,也不是同性恋,呵呵
Top
11 楼MorningTea(一勺抹茶)回复于 2005-08-22 22:03:49 得分 1
cpucontrol,你留个email吧,我做好贴图,寄给你(加入你还不是没有master那个方法的话,不过相信你可以的,很简单的,呵呵)Top
12 楼yuchuanbo(xiaoyu)回复于 2005-08-22 22:08:22 得分 0
"delete a from TableA a join TableA b on a.id = b.id where a.id>b.id"
这个写的不对。晕。
delete a from TableA a join TableA b on a.customer = b.customer and a.PhoneNo = b.PhoneNo where a.id>b.id
嘿嘿,不好意思!Top
13 楼filebat(Mark)回复于 2005-08-22 22:12:35 得分 0
to zlp321002(想在北京找份工作!) :呵呵, 是有些问题。 我求是的每组id最大的那条记录。
应该求最小的记录才对。
你的是对的。
to MorningTea(一勺抹茶):
"反正我不是GG或者MM,总之我不是阴阳人啦,也不是同性恋,呵呵"
回答得是没错, 不过没有答到点子上。所以不得分。Top
14 楼MorningTea(一勺抹茶)回复于 2005-08-22 22:16:06 得分 0
回复人: filebat(Mark) ( ) 信誉:100 2005-08-22 22:12:00 得分: 0
to zlp321002(想在北京找份工作!) :呵呵, 是有些问题。 我求是的每组id最大的那条记录。
应该求最小的记录才对。
你的是对的。
to MorningTea(一勺抹茶):
"反正我不是GG或者MM,总之我不是阴阳人啦,也不是同性恋,呵呵"
回答得是没错, 不过没有答到点子上。所以不得分。
---Ladies or Gentleman ,您不是要看我的自拍吧,哈哈!
就不告诉你,就不告诉你。。。。。。
下线了!Top
15 楼cpucontrol(可以包含)回复于 2005-08-22 22:41:14 得分 0
select distinct * into #temp from 表
truncate table 表
insert 表 select * from #temp
drop table #temp
这个方法不知道可不可以行得通,我运行的时候 第一句出错了。Top
16 楼cpucontrol(可以包含)回复于 2005-08-22 23:02:37 得分 0
select col1,col2..... into #temp from table group by col1,col2....
truncate table
insert into table select * from #temp
Top
17 楼cpucontrol(可以包含)回复于 2005-08-22 23:03:42 得分 0
感谢各位参与我的问题讨论。谢谢大家。接帖子。Top




