CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

SQL Server中删除重复数据的几个方法

楼主yanglilibaobao()2006-12-11 10:59:04 在 MS-SQL Server / 应用实例 提问

数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……    
   
  方法一  
   
  declare   @max   integer,@id   integer  
  declare   cur_rows   cursor   local   for   select   主字段,count(*)   from   表名   group   by   主字段   having   count(*)   >   1  
  open   cur_rows  
  fetch   cur_rows   into   @id,@max  
  while   @@fetch_status=0  
  begin  
  select   @max   =   @max   -1  
  set   rowcount   @max  
  delete   from   表名   where   主字段   =   @id  
  fetch   cur_rows   into   @id,@max  
  end  
  close   cur_rows  
  set   rowcount   0  
   
   
  方法二  
   
    有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。  
   
    1、对于第一种重复,比较容易解决,使用  
   
  select   distinct   *   from   tableName  
   
   
    就可以得到无重复记录的结果集。  
   
    如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除  
   
  select   distinct   *   into   #Tmp   from   tableName  
  drop   table   tableName  
  select   *   into   tableName   from   #Tmp  
  drop   table   #Tmp    
   
   
    发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。  
   
    2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下  
   
    假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集  
   
  select   identity(int,1,1)   as   autoID,   *   into   #Tmp   from   tableName  
  select   min(autoID)   as   autoID   into   #Tmp2   from   #Tmp   group   by   Name,autoID  
  select   *   from   #Tmp   where   autoID   in(select   autoID   from   #tmp2)    
   
   
    最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)  
   
    查询分析器不能单步调试的的原因  
   
    具体步骤如下:    
   
    1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)    
   
    2、在【控制面板】中打开【服务】将【MS   SQL   Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;    
   
    3、重新启动SQL   Server服务,此时的服务指的是【SQL服务管理器】中的SQL   Server服务;假设【帐号】设置为administrator   。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:    
    a、在【服务器】上运行dcomcnfg.exe;    
   
    b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;    
   
    c、重新启动SQL   Server服务;    
   
    3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。    
    注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event   log:以当前密码登录的尝试因下列错误而宣告失败:   在第一次登录之前,必须更改用户密码。    
   
                 
               
                  选自:http://tech.it168.com/db/s/2006-08-09/200608090921177.shtml 问题点数:100、回复次数:59Top

1 楼coolingpipe(冷箫轻笛)回复于 2006-12-11 11:00:05 得分 0

哦  
  学习!Top

2 楼akkie()回复于 2006-12-11 11:01:03 得分 20

upTop

3 楼lxzm1001(*~悠悠蓝星梦~*)回复于 2006-12-11 11:13:10 得分 0

thanksTop

4 楼sgucxc0(ben)回复于 2006-12-11 11:15:43 得分 20

好。接分来了。Top

5 楼dawugui(潇洒老乌龟)回复于 2006-12-11 11:22:29 得分 0

學習+接分  
  Top

6 楼caixia615(*^_^*)‵My ɡīr!.ˊ想念妳ˋ 。(*^_^*)回复于 2006-12-11 11:23:38 得分 0

up,jf,学习Top

7 楼wangeju2003()回复于 2006-12-11 11:46:58 得分 20

學習+接分Top

8 楼liuyxit(初学Oracle)回复于 2006-12-11 11:49:56 得分 20

TKSTop

9 楼marco08(天道酬勤)回复于 2006-12-11 13:19:30 得分 0

學習+接分Top

10 楼marco08(天道酬勤)回复于 2006-12-11 13:19:39 得分 0

收藏先...Top

11 楼shawnwan()回复于 2006-12-11 15:14:43 得分 20

。。这不是问题,而是解答吧????????????Top

12 楼sdhylj(青锋-SS)(献血有益健康(别人的))回复于 2006-12-11 15:16:18 得分 0

答案.Top

13 楼zzxiaoma(小马)回复于 2006-12-12 08:55:18 得分 0

学习Top

14 楼zzxiaoma(小马)回复于 2006-12-12 08:55:35 得分 0

学习Top

15 楼qianjin558()回复于 2006-12-12 09:02:09 得分 0

好东西,收藏,希望楼主多多传授经验,谢了   !Top

16 楼yangyangxie(想飞的鱼)回复于 2006-12-12 09:36:49 得分 0

路过,学习一下Top

17 楼jackyqk()回复于 2006-12-12 09:39:57 得分 0

up+study+jf+^_^Top

18 楼shuqinpeng(苏秦)回复于 2006-12-12 10:07:23 得分 0

markTop

19 楼new_bcb()回复于 2006-12-12 10:50:21 得分 0

markTop

20 楼yi10000()回复于 2006-12-12 11:20:20 得分 0

楼主,好人...Top

21 楼eqh(我想早恋,可已经晚了...)回复于 2006-12-13 10:40:34 得分 0

学习了·Top

22 楼SZSEAWIND()回复于 2006-12-13 10:52:24 得分 0

goodTop

23 楼SupermanZgn(Sunny)回复于 2006-12-13 10:59:17 得分 0

实用。。Top

24 楼Saro(这也不是江水,这是二十年流不尽的英雄血。)回复于 2006-12-13 11:27:02 得分 0

学习Top

25 楼hymxtang(书童)回复于 2006-12-13 11:30:31 得分 0

好东西,收藏先...Top

26 楼lvjx125()回复于 2006-12-13 11:51:42 得分 0

學習+接分  
   
  收藏Top

27 楼xiaoku(野蛮人(^v^))回复于 2006-12-13 11:52:07 得分 0

接分谢谢...Top

28 楼mincunbao(衝動是魔鬼)回复于 2006-12-13 12:46:58 得分 0

学习,收藏Top

29 楼hdhmail2000(禅剑飞雪)回复于 2006-12-13 12:47:22 得分 0

很好,面试碰到过Top

30 楼laig8588(世界末日)回复于 2006-12-13 13:01:20 得分 0

Good   Good   study,Day   Day   Up!  
  Top

31 楼Sandy945(阿非)回复于 2006-12-13 13:06:08 得分 0

upTop

32 楼Bestkiller(重生的小強)回复于 2006-12-13 13:37:36 得分 0

学习Top

33 楼blueice008(无忧)回复于 2006-12-13 13:41:24 得分 0

学习Top

34 楼sclml()回复于 2006-12-13 13:56:31 得分 0

谢谢Top

35 楼phommy(石头,竹子,诗)回复于 2006-12-13 14:45:28 得分 0

从不知道查询分析器可以单步调试...    
  抽自己俩嘴巴应该Top

36 楼tianbing0401(tiantian)回复于 2006-12-13 14:54:59 得分 0

很棒     学习中Top

37 楼kinglh(小晖)回复于 2006-12-13 15:04:17 得分 0

不错   接发Top

38 楼tomhuang(春城)回复于 2006-12-13 15:14:15 得分 0

接分Top

39 楼babywywy()回复于 2006-12-13 16:27:50 得分 0

的确是好文章,这种文章对我们新人来说意义很大!Top

40 楼sp4(1)回复于 2006-12-13 16:37:01 得分 0

删除重复数据http://www.cnblogs.com/piaoqingsong/archive/2006/08/08/470931.htmlTop

41 楼Bennyatt()回复于 2006-12-13 16:48:21 得分 0

大家看看我这个   怎么过滤???  
  比如我   表如下  
  sid     nid     name     mark     time  
  sid     系统id       nid   标号   name   名字   mark   分数   time   修改时间  
   
  1我要找出   nid       name     都一样   的记录  
  然后   把   time   最新的   记录保留     期于的   删除  
   
  大家看看   这个   sql怎么写~~~  
  感激不禁~~~Top

42 楼zxyfp(千里马)回复于 2006-12-13 16:49:46 得分 0

学习学习啊Top

43 楼FEB15(张郎)回复于 2006-12-13 19:31:12 得分 0

踩个脚印Top

44 楼flyingjava()回复于 2006-12-13 21:56:21 得分 0

学习Top

45 楼qiusp001()回复于 2006-12-13 22:04:03 得分 0

markTop

46 楼Amwpfiqvy(给我分吧,让我升仙)回复于 2006-12-14 08:08:45 得分 0

要收藏Top

47 楼yiyefuping(一叶浮萍)回复于 2006-12-14 08:48:54 得分 0

markTop

48 楼ldslove()回复于 2006-12-14 09:07:23 得分 0

收藏Top

49 楼Mapleleaf123(为分而努力)回复于 2006-12-14 09:37:49 得分 0

收藏+接分Top

50 楼qfkfw(空军一号)回复于 2006-12-14 09:41:15 得分 0

收藏+接分  
  Top

51 楼wuya8115(无涯)回复于 2006-12-14 11:48:55 得分 0

顶,谢谢,Top

52 楼zzyong00(阿勇)回复于 2006-12-14 13:21:20 得分 0

收了Top

53 楼yudi010(★★逍遥浪子★★)回复于 2006-12-14 17:05:10 得分 0

如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除  
   
  select   distinct   *   into   #Tmp   from   tableName  
  drop   table   tableName  
  select   *   into   tableName   from   #Tmp  
  drop   table   #Tmp    
   
  你这句话有问题的  
  因为你这样做,tablename中设置的主键就没有了,所以不能够这么进行删除  
  Top

54 楼Juchiyufei(三更半夜我送你回家.总统也许我做不到.今生难得的遇见你,我们就应该在一起.....)回复于 2006-12-15 10:09:57 得分 0

mark  
  Top

55 楼dangerhu(不会编程的危险胡!)回复于 2006-12-15 22:23:29 得分 0

学了   ,Top

56 楼dbdebuger(深入数据库编程中...)回复于 2006-12-15 23:26:03 得分 0

谢谢,不过有两个地方没用过,我要试试好不好用Top

57 楼hhuosheng()回复于 2006-12-17 07:31:03 得分 0

好的,非常好  
  学到了东西啊!  
  谢谢你   楼主Top

58 楼jason_mf()回复于 2007-03-12 11:10:36 得分 0

收藏Top

59 楼ls212(鲁四)回复于 2007-03-19 09:47:41 得分 0

收藏!Top

相关问题

关键词

得分解答快速导航

  • 帖主:yanglilibaobao
  • akkie
  • sgucxc0
  • wangeju2003
  • liuyxit
  • shawnwan

相关链接

  • SQL Server类图书

广告也精彩

反馈

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