您的位置:首页 > 数据库 > SQL语言 > 正文

Sql如何删除重复记录

更多 时间:2014-6-25 类别:数据库 浏览量:600

Sql如何删除重复记录

Sql如何删除重复记录

一、Sql产生重复记录的原因

 

1、完全重复的记录

完全重复的数据,通常是由于没有设置主键/唯一键约束导致的。
 

2、部分重复的记录

部分列重复的数据,通常表上是有主键的,可能是程序逻辑造成了多行数据列值的重复。
 

 

二、Sql删除重复记录的方法

 

1、删除完全重复的记录

(1) 借助临时表

利用DISTINCT得到单条记录,删除源数据,然后导回不重复记录。
如果表不大的话,可以把所有记录导出一次,然后truncate表后再导回,这样可以避免delete的日志操作。

例如

  •  
  • SQL 代码   复制
  • 
    
    if OBJECT_ID('tempdb..#tmp') is not null
    drop table #tmp 
    GO 
    select distinct * into #tmp 
    from duplicate_all 
    where c1 = 1 
    GO 
    delete duplicate_all where c1 = 1 
    GO 
    insert into duplicate_all 
    select * from #tmp
    
    		
  •  

    (2) 使用ROW_NUMBER

  •  
  • SQL 代码   复制
  • 
    
    with tmp 
    as
    ( 
    select *,ROW_NUMBER() OVER(PARTITION BY c1,c2,c3 ORDER BY(getdate())) as num 
    from duplicate_all 
    where c1 = 1 
    ) 
    delete tmp where num > 1
    
    		
  •  

    (3)、如果多个表有完全重复的行,可以考虑通过UNION将多个表联合,插到一个新的同结构的表,SQL Server会帮助去掉表和表之间的重复行。

     

    2、删除部分重复的记录

    (1) 唯一索引

    唯一索引有个忽略重复建的选项,在创建主键约束/唯一键约束时都可以使用这个索引选项。
     

    例如

  •  
  • SQL 代码   复制
  • 
    
    if OBJECT_ID('tmp') is not null
    drop table tmp 
    GO 
    create table tmp 
    ( 
    c1 int, 
    c2 int, 
    c3 varchar(100), 
    constraint UQ_01 unique(c2,c3) with(IGNORE_DUP_KEY = ON) 
    ) 
    GO 
    insert into tmp 
    select * from duplicate_col 
    select * from tmp
    
    		
  •  

    (2) 借助主键/唯一键来删除

    通常会选择主键/唯一键的最大/最小值保留,其他行删除。以下只保留重复记录中c1最小的行。
     

  •  
  • SQL 代码   复制
  • 
    
    delete from duplicate_col 
    where exists(select 1 from duplicate_col b where duplicate_col.c1 > b.c1 and (duplicate_col.c2 = b.c2 and duplicate_col.c3 = b.c3)) 
    
    --或者
    
    delete from duplicate_col 
    where c1 not in (select min(c1) from duplicate_col group by c2,c3)
    		
  •  

    (3) ROW_NUMBER
     

  •  
  • SQL 代码   复制
  • 
    
    with tmp 
    as
    ( 
    select *,ROW_NUMBER() OVER(PARTITION BY c2,c3 ORDER BY(getdate())) as num 
    from duplicate_col 
    ) 
    delete tmp where num > 1 
    select * from duplicate_col
    
    		
  •  

    标签:Sql