`

用SQL语句删除重复记录

阅读更多

刚刚想整理下删除重复记录的各种解决方案,布列如下:

 

问题:如何把具有相同字段的记录删除,只留下一条。例如:表test里有id,name字段,如果有name相同的记录只留下一条,其余的删除。name的内容不定,相同的记录数不定。

 

方法一:

  1、将重复的记录记入temp1表:

    select *  into temp1 from (

                       select * from test t where t.name in (

                          select name,count(id) as counts from test tst group by tst.name having count(id)>1

                       )

    );

 

  2、将不重复的记录插入temp2表:

     

    select *  into temp2 from (

                       select * from test t where t.name in (

                          select name,count(id) as counts from test tst group by tst.name having count(id)=1

                       )

    );

 

   3、删除原来的表: delete from test;

   4、将temp2表的记录插入原来的表:insert into test select * from temp2;

   5、将temp1表的记录插入原来的表:insert into test select distinct name from temp1;

   6、删除临时表:drop temp1; drop temp2;

 

方法二:

       declare @max integer,@id integer;
   
      declare cur_rows cursor local for 
      select id,count(*) from 表名 group by id having count(*) > 1;
      open cur_rows
      fetch cur_rows into @id,@max
      while @@fetch_status=0;
      begin
        select @max = @max -1 from dual;
        set rowcount @max;
        delete from 表名 where id = @id;
        fetch cur_rows into @id,@max;
      end;
      close cur_rows;
      set rowcount 0;

 

 

注:set rowcount @max - 1表示当前缓冲区只容纳@max-1条记录,如果有十条重复的,就刪除10条,一定会留一条的。也可以写成delete from 表名。

 

 

 

另外一种情况---如何按字段删除重复记录?  
   
  一张表里面以两个字段为唯一字段,当几条记录的这两个字段完全相同时,需要删除重复项,如下表  
  a   b   c   d  
  1   2   3   4  
  1   5   3   5  
  1   2   7   9  
  以a、b为唯一字段,第一条和第三条的a、b完全相同,所以,需要删除第一条记录1   2   3   4   或者第三条记录1   2   7   9  
  即如下结果:  
  a   b   c   d  
  1   2   3   4  
  1   5   3   5  
  或  
  a   b   c   d  
  1   5   3   5  
  1   2   7   9   
    
方法如下:
     

CREATE   TABLE   Tb1(id   int,   [a]   varchar(255),   [b]   varchar(255),   [c]   varchar(255),   [d]   varchar(255))   
  INSERT   Tb1(id,   [a],   [b],   [c],   [d])   
                        SELECT   1,   '1','2','3','4'   
  UNION   ALL     SELECT   2,   '1','5','3','5'   
  UNION   ALL     SELECT   3,   '1','2','7','9'   
  UNION   ALL     SELECT   4,   '1','4','7','6'   
    
  delete   Tb1   where   [id]   not   in   (select   max([id])   from   Tb1   group   by   a,b   )   
  select   *   from   tb1   
      
  drop   table   tb1   
    
  如果要同时删除第一和第三行   
  即如下结果:   
  a   b   c   d   
  1   5   3   5   
    
  语句如下:   
    
  delete   m   from   tb   t   
  inner   join   
  (   
  select   a   ,b   
  from   tb   
  group   by   a   ,   b   
  having   count(*)>1   
  )n   
  on   m.a   =   n.a   and   m.b   =   n.b     
  或   
  delete   *   from   tb   as   m,   
  (   
  select   a   ,b   
  from   tb   
  group   by   a   ,   b   
  having   count(*)>1   
  )n   
  where   m.a   =   n.a   and   m.b   =   n.b

 

第三种情况-----在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的
 

1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断   
  select   *   from   people   
  where   peopleId   in   (select     peopleId     from     people     group     by     peopleId     having     count(peopleId)   >   1)   
    
  2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录   
  delete   from   people     
  where   peopleId     in   (select     peopleId     from   people     group     by     peopleId       having     count(peopleId)   >   1)   
  and   rowid   not   in   (select   min(rowid)   from     people     group   by   peopleId     having   count(peopleId   )>1)   
    
  3、查找表中多余的重复记录(多个字段)     
  select   *   from   vitae   a   
  where   (a.peopleId,a.seq)   in     (select   peopleId,seq   from   vitae   group   by   peopleId,seq     having   count(*)   >   1)   
    
  4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录   
  delete   from   vitae   a   
  where   (a.peopleId,a.seq)   in     (select   peopleId,seq   from   vitae   group   by   peopleId,seq   having   count(*)   >   1)   
  and   rowid   not   in   (select   min(rowid)   from   vitae   group   by   peopleId,seq   having   count(*)>1)   
    
  5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录   
  select   *   from   vitae   a   
  where   (a.peopleId,a.seq)   in     (select   peopleId,seq   from   vitae   group   by   peopleId,seq   having   count(*)   >   1)   
  and   rowid   not   in   (select   min(rowid)   from   vitae   group   by   peopleId,seq   having   count(*)>1)   

 

   今天暂且整理到此,后续接着整理。2009-8-31 16:58

 

 

 

分享到:
评论

相关推荐

    SQL语句删除重复记录

    SQL语句删除重复记录 在数据库管理中,删除重复记录是一个非常重要的操作。重复记录可能来自于数据导入、系统错误或者其他原因。今天,我们将探讨如何使用 SQL 语句删除重复记录。下面将介绍四种不同的方法来删除...

    四种SQL语句删除重复记录的方法

    ### 四种SQL语句删除重复记录的方法 在数据库管理中,经常会出现数据冗余的情况,特别是当数据量庞大时,这种现象更为普遍。对于重复记录的处理是维护数据库完整性和提高查询效率的重要手段之一。本文将详细介绍四...

    SQL语句查询重复记录大全

    ### SQL语句删除所有重复记录 #### 1. 删除重复记录的基本方法 - **基本思路**:通常的做法是先找出重复记录,然后使用`DELETE`语句删除它们。 - **SQL示例**: ```sql DELETE FROM people WHERE peopleId IN ( ...

    使用Oracle查询并删除重复记录的SQL语句

    使用Oracle查询并删除重复记录的SQL语句 在实际应用中,删除重复记录是非常常见的操作,特别是在数据导入、数据整合和数据清洁等场景中。Oracle数据库提供了多种方式来查询和删除重复记录,本文将详细介绍这些方法...

    删除表中重复数据sql语句

    以上SQL语句能够帮助我们删除除了具有最小ROWID之外的所有重复记录。 3. **查找表中多余的重复记录(不含最小ROWID)** ```sql SELECT * FROM vita_ea WHERE (a.peopleId, a.seq) IN ( SELECT peopleId, seq ...

    查询及删除重复记录的SQL语句.

    删除重复记录时,通常保留一个代表性的记录,例如保留 `ROWID` 最小的记录。可以使用以下 SQL 语句: ```sql DELETE from 表 WHERE (id) IN ( SELECT id FROM 表 GROUP BY id HAVING COUNT(id) > 1) AND ...

    删除数据表中重复记录

    本文将详细介绍如何在不同的数据库系统(如MySQL、SQL Server、Oracle等)中删除重复记录。 #### SQL删除重复记录的基本思路 删除重复记录的核心思想是先识别出哪些记录是重复的,然后通过某种方式将这些重复记录...

    sql查询重复记录语句

    删除重复记录是数据清理的重要步骤,以下是一种通用的删除所有重复记录的方法: ```sql DELETE FROM tableName WHERE colName IN (SELECT colName FROM tableName GROUP BY colName HAVING COUNT(*) > 1); ``` ...

    SQL语句删除数据表中重复的记录

    以下是如何使用SQL语句来删除数据表中重复记录的详细步骤。 首先,我们来看一个简单的例子,假设我们有一个名为`Repeat`的数据表,其中存在重复的记录。要删除这些重复的记录,但保留每个唯一组合的最新(最大`id`...

    sqlServer删除重复数据

    使用游标可以删除重复记录,每次删除一条记录。例如: ```sql DECLARE @max INTEGER, @id INTEGER DECLARE cur_rows CURSOR LOCAL FOR SELECT 主字段, COUNT(*) FROM 表名 GROUP BY 主字段 HAVING COUNT(*) > 1 OPEN...

    sql删除表中重复记录方法

    标题与描述概述的知识点是关于如何使用SQL语句来删除数据库表中的重复记录,这是一个在数据清理和维护数据完整性时非常实用的技术。以下是对给定文件中四种方法的详细解析和扩展,旨在帮助读者深入理解并掌握这些...

    SQL删除重复行

    2. **删除重复记录**:保留每个`peopleId`的最小`rowid`,删除其他重复的行: ```sql DELETE FROM people WHERE peopleId IN ( SELECT peopleId FROM people GROUP BY peopleId HAVING COUNT(peopleId) > 1 ) ...

    sql查询重复记录方法大全

    - `rowid`用于唯一标识每条记录,从而能够更准确地删除重复记录。 #### 方法八:处理具有多个重复字段的记录 **SQL语句**: ```sql SELECT DISTINCT * INTO #Tmp FROM tableName; DROP TABLE tableName; SELECT * ...

    oracle删除重复数据的sql语句

    这条语句同样将删除除了每个peopleId和seq组合中ROWID最小的记录之外的所有重复记录。 综上所述,通过ROWID、GROUP BY和DISTINCT等多种方式,可以灵活有效地处理Oracle数据库中的重复数据问题。在实际应用中,可以...

    SQL语句实现删除重复记录并只保留一条

    本文将详细介绍如何使用SQL语句删除重复记录并仅保留一条。 首先,我们来看一种常见的实现方式,例如在`WeiBoTopics`表中删除重复记录并保留Id最大的一条。以下是一个SQL查询示例: ```sql DELETE FROM ...

    arcgis中的sql语句

    - **VBE环境下ADO方式执行SQL**:在Visual Basic for Applications (VBA)环境中,使用ActiveX Data Objects (ADO)技术可以实现SQL语句的自动化执行,适用于大规模数据处理和脚本编程。 综上所述,SQL在ArcGIS中的...

    查询和删除表中重复数据sql语句

    对于涉及多个字段的重复记录删除,上述语句使用相同的逻辑,只是增加了`seq`字段作为复合键的一部分,以确保在删除时考虑到所有指定字段的组合。 ### 特殊类型字段的处理 对于`text`、`ntext`、`img`等类型字段,...

    基本SQL语句及PL/SQL语句

    文件"sql语句.ppt"和"PLSQL.ppt"可能包含了这些概念的详细解释和实例,帮助读者深入理解和掌握SQL和PL/SQL的使用。学习这些语句和语言对于任何需要与数据库交互的开发工作都是至关重要的,无论是在Web开发、数据分析...

    基本的去重复sql语句

    这段SQL语句的主要作用是从`CUSTOM_INFO`表中删除重复记录,保留每组中`rowid`最大的一条记录。具体步骤如下: 1. **子查询**:`(SELECT MAX(rowid) FROM CUSTOM_INFO b WHERE a.sampleid = b.sampleid)`用来找出与...

    sql 查询重复数据

    删除重复记录可以使用以下 SQL 语句: ```sql DELETE 表 WHERE 重复字段 In (SELECT 重复字段 FROM 表 GROUP BY 重复字段 HAVING COUNT(*) > 1); ``` 保留一条重复记录 如果只想保留一条重复记录,可以...

Global site tag (gtag.js) - Google Analytics