CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

用SQL保证数据唯一性的问题?

楼主treeClimber(我以我血荐轩辕)2005-08-01 16:40:38 在 MS-SQL Server / 基础类 提问

我有一张海量数据的表,由于设计时没有设定主键,发现有很多重复的数据,请问如何用一条(几条)SQL语句删除重复的数据,即多条重复数据只保留一条。  
  重谢! 问题点数:30、回复次数:14Top

1 楼WangZWang(先来)回复于 2005-08-01 16:50:13 得分 0

select   *   into   xxx    
  from   表名  
   
  delete   表名  
   
  insert   into   表名  
  select   *   from   xxx  
   
  drop   table   xxxTop

2 楼WangZWang(先来)回复于 2005-08-01 16:51:50 得分 0

--第一行改为  
  select   distinct   *   into   xxx    
  from   表名Top

3 楼hzxiaofeng()回复于 2005-08-01 16:54:04 得分 0

支持楼上的Top

4 楼tjficcbw(津津)回复于 2005-08-01 17:03:35 得分 2

select   *   into   新表   from   旧表   where   字段名a   in   (select   top   1   字段名a   from   表名   group   by   字段名a)Top

5 楼tjficcbw(津津)回复于 2005-08-01 17:04:23 得分 0

select   *   into   新表   from   旧表   where   字段名a   in   (select   top   1   字段名a   from   表名   group   by   字段名a)Top

6 楼LSL_winnie(麒麟)回复于 2005-08-01 17:29:07 得分 10

CREATE   procedure   DeleteUser   AS          
  begin  
        declare   @dnIndex   numeric,       --索引号  
                                @dcOldUserNum   varchar(21),       --上次用户手机号  
                                @dcNewUserNum   varchar(21)       --本次用户手机号  
        declare   DELETE_Cursor   cursor   for    
                    select   dIndex,UserNum   from   TABLE1   order   by   userNum  
                                        open   DELETE_Cursor       fetch   next   from     DELETE_Cursor   into   @dnIndex,@dcNewUserNum  
                                              while   @@FETCH_STATUS   =   0  
                                                            begin  
                                                                                          if   (@dcNewUserNum   =   @dcOldUserNum)  
                                                                                            delete   from   table1   where   dIndex=@dnIndex  
                                                                                      else    
                                                                                              select   @dcOldUserNum=@dcNewUserNum  
                                                                        end  
                                                              fetch   next   from     DELETE_Cursor     into   @dnIndex,@dcNewUserNum  
                                                  end  
                                        close   DELETE_Cursor  
                    deallocate   DELETE_Cursor  
  end  
  GO  
   
  --exec   DeleteUserTop

7 楼LSL_winnie(麒麟)回复于 2005-08-01 17:37:19 得分 0

1楼效率是个问题,搂主说了是海量数据,tjficcbw(津津)   你的好像不行呀。Top

8 楼sy251216(sy)回复于 2005-08-01 18:29:44 得分 0

怎么在原表中实现那?不要老是去做到新表里去。我试了很多办法做不到Top

9 楼junly1981(浪子心声)回复于 2005-08-01 20:10:54 得分 0

同意楼上:WangZWang(阿来)   的,选排除重复项的方法,插入到另一表,然后清除完原表,再导回来就OK了Top

10 楼bugchen888(臭虫)回复于 2005-08-01 20:34:08 得分 0

WangZWang(阿来)是个不错的解决方案.Top

11 楼MorningTea(一勺抹茶)回复于 2005-08-01 20:53:28 得分 15

大家回答那么多,感觉重复应该有2种情况。是所有字段相同,还只是某些字段重复  
  1.如果是所有字段重复,那么就是用  
    回复人:   WangZWang(阿来)   (   )   信誉:100     2005-08-01   16:50:00     得分:   0      
     
     
        select   distinct   *   into   xxx    
  from   表名  
   
  delete   表名  
   
  insert   into   表名  
  select   *   from   xxx  
   
  drop   table   xxx  
   
  2。如果只是某些字段重复,那么就是   tjficcbw(津津)所认为的情况,他知道那么一回事,但是代码没有实现,实际会把所有的资料都导到临时表  
   
  3.   回复人:   LSL_winnie(麒麟)   (   )   信誉:100     2005-08-01   17:37:00     得分:   0      
     
     
        1楼效率是个问题,搂主说了是海量数据,tjficcbw(津津)   你的好像不行呀。  
   
    我觉得WangZWang(阿来)得很好,因为你是海量,也没有办法的,你整合过一次,设立主键维护,那  
   
  么不就是ok的吗,然后好好维护,资料过多就备份,这样资料库服务器才不会挂了~~  
   
  tjficcbw(津津)的不是不行,而是也有情况是某列栏位重复就认为是重复,不过按照楼主说因为没有加上key值而导致的重复,那么tjficcbw(津津)认为的情况不存在,如果是存在,那么那个字段名a   不就是key值了吗?这样情况可以,用临时表,并且加上identity(),假设栏位为nam  
  select   identity(int,1,1)   as   sn   ,*   into   #T   from   表  
  --所有纪录插入临时表#T,并且每一条加上序号sn  
  select   ColNam2,ColNam3,...,ColNamN--除了序号sn  
  from   #T   T    
  where   not   exists   (select   T1.nam   from   #T   T1   where   T1.nam   =   T.nam  
  and   T.sn   <T1.sn     )Top

12 楼tntzbzc(华裔大魔王—抗日要从娃娃抓起)回复于 2005-08-01 23:59:17 得分 2

问1楼  
  如果是海量数据,在执行插入临时表可能会超时或崩溃。超时会导致SQL2K自动枪毙操作,这时应该怎么办?Top

13 楼WangZWang(先来)回复于 2005-08-02 08:57:04 得分 0

把设置超时的时间为无限制即设置为0,   然后暂时把表的所有索引屏蔽掉,执行操作.Top

14 楼fiele(半导体)回复于 2005-08-02 09:55:50 得分 1

select   distinct   *   into   新表   from   旧表    
  delete   from   旧表  
  insert   into   旧表  
  select   *   from   新表Top

相关问题

  • 要怎样保证公司名称的唯一性呢?
  • access数据库中判断数据的唯一性
  • 一个数据更新,验证唯一性的问题!!
  • 关于数据唯一性筛选的问题,急!
  • 怎样由两列数据来决定记录的唯一性?
  • Shell处理数据的唯一性问题
  • 要怎样保证公司名称的唯一性,给我一点思路
  • 在SQL表中如何创建唯一性约束?
  • 如何删除重复记录,使其保持数据的唯一性
  • 请教:再设置数据列的唯一性为真后,如果自定义违反唯一性后的信息?

关键词

  • 字段
  • 数据
  • 表
  • 字段名
  • dcnewusernum
  • 重复
  • dnindex
  • tjficcbw
  • wangzwang
  • dcoldusernum

得分解答快速导航

  • 帖主:treeClimber
  • tjficcbw
  • LSL_winnie
  • MorningTea
  • tntzbzc
  • fiele

相关链接

  • SQL Server类图书

广告也精彩

反馈

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