SQL命令删除一个表中相同记录

SQL命令删除一个表中相同记录  
  

推荐 删除重复数据    
     
  一、具有主键的情况    
  a.具有唯一性的字段id(为唯一主键)    
  delect   table      
  where   id   not   in      
  (    
  select   max(id)   from   table   group   by   col1,col2,col3...    
  )    
  group   by   子句后跟的字段就是你用来判断重复的条件,如只有col1,    
  那么只要col1字段内容相同即表示记录相同。    
     
  b.具有联合主键    
  假设col1+','+col2+','...col5   为联合主键    
  select   *   from     table   where   col1+','+col2+','...col5   in   (    
      select   max(col1+','+col2+','...col5)   from   table      
  where   having   count(*)>1    
  group   by   col1,col2,col3,col4      
  )    
  group   by   子句后跟的字段就是你用来判断重复的条件,    
  如只有col1,那么只要col1字段内容相同即表示记录相同。    
     
     
  or    
  select   *   from   table     where   exists   (select   1   from   table   x   where   table.col1   =   x.col1   and      
  table.col2=   x.col2   group   by   x.col1,x.col2   having   count(*)   >1)    
     
  c:判断所有的字段    
      select   *   into   #aa   from   table   group   by   id1,id2,....    
      delete   table      
      insert   into   table      
      select   *   from   #aa    
     
  二、没有主键的情况    
     
  a:用临时表实现    
  select   identity(int,1,1)   as   id,*   into   #temp   from   ta    
  delect   #temp      
  where   id   not   in      
  (    
      select   max(id)   from   #   group   by   col1,col2,col3...    
  )    
  delete   table   ta    
  inset   into   ta(...)    
        select   .....   from   #temp    
     
  b:用改变表结构(加一个唯一字段)来实现    
  alter   table   表   add     newfield   int   identity(1,1)    
  delete   表    
  where   newfield   not   in    
  (    
  select   min(newfield)   from   表   group   by   除newfield外的所有字 段    
  )    
     
  alter   table   表   drop   column   newfield    
    SQL命令删除一个表中相同记录 

  


首先问题描述: 
  一般数据库中表在设计时都会有主键来约束相同记录,但由于从外部数据源导入或其它原因造成一张表中大量相同记录的问题,可以通过SQL语句实 现去除相同记录的操作: 
状况一:表中主键是自动编号列ID,但实际数据存在大量重复,如果重复记录是有规律的可以通过ID值运算处理,但如果记录重复频率不一,并且数据 量很多的情况下通过企业管理器手工删除是繁琐的,如果使用SQL命令,只需一句即可完成。 
数据格式如下表所示: 
IDStuIDStuNameStuSexStuAddressStuMail 
11001张扬男因果巷1号zy@163.com 
21001张扬男因果巷1号zy@163.com 
31002张律男虎丘路9号zl@eyou.com.cn 
41002张律男虎丘路9号zl@eyou.com.cn 
51002张律男虎丘路9号zl@eyou.com.cn 
61003沈娴华女东环路36号sxh@163.com 
71003沈娴华女东环路36号sxh@163.com 
81003沈娴华女东环路36号sxh@163.com 
91004杜岗男南园南路30号dgang@oceansoft.com 
101004杜岗男南园南路30号dgang@oceansoft.com 
111005许增英女人民路48-6号xzy@eyou.com 
121005许增英女人民路48-6号xzy@eyou.com 

具体SQL命令语句: 
DELETE FROM  Student WHERE  ID   NOT  IN (SELECT  MAX(ID) FROM Student GROUP BY stuID,StuName,StuSex,StuAddress)
这样可以把每行除ID列以外所有相同的数据行中,只保留ID值最大的记录,其余全部删除

 

当然,也可以保留ID列最小的记录行,只需改为MIN(ID)即可 : 
DELETE FROM  Student WHERE  ID   NOT  IN (SELECT  MIN(ID) FROM Student GROUP BY stuID,StuName,StuSex,StuAddress)
  
状况二:表中未设主键,造成记录的重复(在SQL2000企业管理器中无法删除,只能通过查询分析器实现) 
数据格式如下表所示: 
StuIDStuNameStuSexStuAddressStuMail 
1001张扬男因果巷1号zy@163.com 
1001张扬男因果巷1号zy@163.com 
1002张律男虎丘路9号zl@eyou.com.cn 
1002张律男虎丘路9号zl@eyou.com.cn 
1002张律男虎丘路9号zl@eyou.com.cn 
1003沈娴华女东环路36号sxh@163.com 
1003沈娴华女东环路36号sxh@163.com 
1003沈娴华女东环路36号sxh@163.com 
1004杜岗男南园南路30号dgang@oceansoft.com 
1004杜岗男南园南路30号dgang@oceansoft.com 
1005许增英女人民路48-6号xzy@eyou.com 
1005许增英女人民路48-6号xzy@eyou.com 

这种情况,可以通过生成新表的方式实现:筛选出不同的记录(Distinct)插入新表(NewStudent) 
SELECT  DISTINCT  *  INTO  NewStudent    FROM  Student  

使用SQL命令删除表中相同记录 

  

帮助文件中有关 DELETE 方法的示例非常值得借鉴: 

SQL命令删除一个表中相同记录示例  
本示例删除 Sheet1 的 A1:D10 单元格区域,并将其右侧单元格向左移位。 

Worksheets("Sheet1").Range("A1:D10").Delete Shift:=xlShiftToLeft  
本示例删除活动工作簿的 Sheet3 工作表,并且不显示确认对话框。 

Application.DisplayAlerts = FalseWorksheets("Sheet3").DeleteApplication.DisplayAlerts = True  
本示例在指定工作表的列中对数据进行排序,然后删除包含重复数据的行。 

Worksheets("Sheet1").Range("A1:D10").Delete Shift:=xlShiftToLeft 本示例 删除活动工作簿的 Sheet3 工作表,并且不显示确认对话框。 

Application.DisplayAlerts = False Worksheets("Sheet3").Delete Application.DisplayAlerts = True 本 示例在指定工作表的列中对数据进行排序,然后删除包含重复数据的行。 

Sub DeleteColumnDupes(strSheetName As String, strColumnLetter As String) Dim strColumnRange As String Dim

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值