CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

用sql语句在一个表中删除重复记录

楼主cpucontrol(可以包含)2005-08-22 21:25:26 在 MS-SQL Server / 基础类 提问

情况如下:表中有条六条记录。   其中张三和王五   的记录有重复  
  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

相关问题

  • SQL语句请教-关于删除表
  • SQL删除语句求助!
  • 简单sql删除语句
  • 如何用sql语句删除一个临时表?
  • 执行sql语句删除表的数据的操作问题
  • 求删除表中重复记录的sql语句!!!
  • 如何用sql语句删除access表的关系?
  • 删除表之间的关系的SQL语句怎么写
  • 请问删除表空间的SQL语句是什么?
  • 删除表中前20条记录的SQL语句怎么写?

关键词

  • phoneno
  • tablea
  • morningtea
  • 表
  • 记录
  • 同性恋
  • 抹茶
  • 方法
  • 阴阳人啦
  • 速度

得分解答快速导航

  • 帖主:cpucontrol
  • filebat
  • vivianfdlpw
  • zlp321002
  • zlp321002
  • MorningTea

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo