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

SQL命令删除一个表中相同记录 
 
0
推荐 删除重复数据   
    
  一、具有主键的情况   
  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 rngCurrentCell As Range Dim rngNextCell As Range strColumnRange = strColumnLetter & "1" Worksheets(strSheetName).Range(strColumnRange).Sort _ Key1:=Worksheets(strSheetName).Range(strColumnRange) Set rngCurrentCell = Worksheets(strSheetName).Range(strColumnRange) Do While Not IsEmpty(rngCurrentCell) Set rngNextCell = rngCurrentCell.Offset(1, 0) If rngNextCell.Value = rngCurrentCell.Value Then rngCurrentCell.EntireRow.Delete End If Set rngCurrentCell = rngNextCell Loop End Sub

posted @ 2010-06-25 17:49  y0umer  阅读(286)  评论(0编辑  收藏  举报