`

用SQL删除重复记录的N种方法(转)

阅读更多
例如:
id           name         value
1               a                 pp
2               a                 pp
3               b                 iii
4               b                 pp
5               b                 pp
6               c                 pp
7               c                 pp
8               c                 iii
id是主键
要求得到这样的结果
id           name         value
1               a                 pp
3               b                 iii
4               b                 pp
6               c                 pp
8               c                 iii

方法1
delete   YourTable 
where   [id]   not   in   (
select   max([id])   from   YourTable 
group   by   (name   +   value))

方法2
delete   a
from   表   a   left   join(
select   id=min(id)   from   表   group   by   name,value
)b   on   a.id=b.id
where   b.id   is   null



查询及删除重复记录的SQL语句
查询及删除重复记录的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)
(二)
比方说
在A表中存在一个字段“name”,
而且不同记录之间的“name”值有可能会相同,
现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;
Select Name,Count(*) From A Group By Name Having Count(*) > 1
如果还查性别也相同大则如下:
Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1

(三)
方法一
declare @max integer,@id integer
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0 方法二
"重复记录"有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
  1、对于第一种重复,比较容易解决,使用
select distinct * from tableName
  就可以得到无重复记录的结果集。
  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
(四)
查询重复
select * from tablename where id in (
select id from tablename
group by id
having count(id) > 1
)


学习sql有一段时间了,发现在我建了一个用来测试的表(没有建索引)中出现了许多的重复记录。后来总结了一些删除重复记录的方法,在Oracle中,可以通过唯一rowid实现删除重复记录;还可以建临时表来实现...这个只提到其中的几种简单实用的方法,希望可以和大家分享(以表employee为例)。

SQL> desc employee

Name                                      Null?    Type
----------------------------------------- -------- ------------------

emp_id                                                NUMBER(10)
emp_name                                           VARCHAR2(20)

salary                                                  NUMBER(10,2)

可以通过下面的语句查询重复的记录:

SQL> select * from employee;


    EMP_ID EMP_NAME                                  SALARY

---------- ---------------------------------------- ----------

         1 sunshine                                      10000

         1 sunshine                                      10000

         2 semon                                         20000

         2 semon                                         20000

         3 xyz                                           30000

         2 semon                                         20000

SQL> select distinct * from employee;

    EMP_ID EMP_NAME                                     SALARY

---------- ---------------------------------------- ----------

         1 sunshine                                      10000

         2 semon                                         20000

         3 xyz                                             30000

SQL> select * from employee group by emp_id,emp_name,salary having count (*)>1

    EMP_ID EMP_NAME                                     SALARY

---------- ---------------------------------------- ----------

         1 sunshine                                      10000

         2 semon                                          20000


SQL> select * from employee e1

where rowid in (select max(rowid) from employe e2
where e1.emp_id=e2.emp_id and

e1.emp_name=e2.emp_name and e1.salary=e2.salary);


    EMP_ID EMP_NAME                                     SALARY

---------- ---------------------------------------- ----------

         1 sunshine                                      10000

         3 xyz                                             30000

         2 semon                                         20000

2. 删除的几种方法:


(1)通过建立临时表来实现

SQL>create table temp_emp as (select distinct * from employee)

SQL> truncate table employee; (清空employee表的数据)

SQL> insert into employee select * from temp_emp; (再将临时表里的内容插回来)


( 2)通过唯一rowid实现删除重复记录.在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大或最小rowid的就可以了,其余全部删除。

SQL>delete from employee e2 where rowid not in (
        select max(e1.rowid) from employee e1 where

        e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and e1.salary=e2.salary);--这里用min(rowid)也可以。


SQL>delete from employee e2 where rowid <(
        select max(e1.rowid) from employee e1 where
        e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and

                  e1.salary=e2.salary);


(3)也是通过rowid,但效率更高。

SQL>delete from employee where rowid not in (
        select max(t1.rowid) from employee t1 group by

         t1.emp_id,t1.emp_name,t1.salary);--这里用min(rowid)也可以。

    EMP_ID EMP_NAME                                     SALARY

---------- ---------------------------------------- ----------

         1 sunshine                                      10000

         3 xyz                                             30000

         2 semon                                         20000


SQL> desc employee

Name                                      Null?    Type
----------------------------------------- -------- ------------------

emp_id                                                NUMBER(10)
emp_name                                           VARCHAR2(20)

salary                                                  NUMBER(10,2)

可以通过下面的语句查询重复的记录:

SQL> select * from employee;


    EMP_ID EMP_NAME                                  SALARY

---------- ---------------------------------------- ----------

         1 sunshine                                      10000

         1 sunshine                                      10000

         2 semon                                         20000

         2 semon                                         20000

         3 xyz                                           30000

         2 semon                                         20000

SQL> select distinct * from employee;

    EMP_ID EMP_NAME                                     SALARY

---------- ---------------------------------------- ----------

         1 sunshine                                      10000

         2 semon                                         20000

         3 xyz                                             30000

SQL> select * from employee group by emp_id,emp_name,salary having count (*)>1

    EMP_ID EMP_NAME                                     SALARY

---------- ---------------------------------------- ----------

         1 sunshine                                      10000

         2 semon                                          20000


SQL> select * from employee e1

where rowid in (select max(rowid) from employe e2
where e1.emp_id=e2.emp_id and

e1.emp_name=e2.emp_name and e1.salary=e2.salary);


    EMP_ID EMP_NAME                                     SALARY

---------- ---------------------------------------- ----------

         1 sunshine                                      10000

         3 xyz                                             30000

         2 semon                                         20000

2. 删除的几种方法:


(1)通过建立临时表来实现

SQL>create table temp_emp as (select distinct * from employee)

SQL> truncate table employee; (清空employee表的数据)

SQL> insert into employee select * from temp_emp; (再将临时表里的内容插回来)


( 2)通过唯一rowid实现删除重复记录.在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大或最小rowid的就可以了,其余全部删除。

SQL>delete from employee e2 where rowid not in (
        select max(e1.rowid) from employee e1 where

        e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and e1.salary=e2.salary);--这里用min(rowid)也可以。


SQL>delete from employee e2 where rowid <(
        select max(e1.rowid) from employee e1 where
        e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and

                  e1.salary=e2.salary);


(3)也是通过rowid,但效率更高。

SQL>delete from employee where rowid not in (
        select max(t1.rowid) from employee t1 group by

         t1.emp_id,t1.emp_name,t1.salary);--这里用min(rowid)也可以。

    EMP_ID EMP_NAME                                     SALARY

---------- ---------------------------------------- ----------

         1 sunshine                                      10000

         3 xyz                                             30000

         2 semon                                         20000

操作多个字段
a.查询
   SELECT * FROM aj_xyrxx t1 WHERE (t1.ajbh,t1.rybh) IN   
    (SELECT t2.ajbh,t2.rybh FROM aj_xyrxx t2   
         GROUP BY t2.ajbh,t2.rybh HAVING COUNT(*) > 1) ;

b.删除
   DELETE FROM aj_xyrxx t1 WHERE (t1.ajbh,t1.rybh) IN   
    (SELECT t2.ajbh,t2.rybh FROM aj_xyrxx t2   
         GROUP BY t2.ajbh,t2.rybh HAVING COUNT(*) > 1) AND   
         ROWID NOT IN (SELECT MIN(ROWID) FROM aj_xyrxx t3   
                  GROUP BY t3.ajbh,t3.rybh  HAVING COUNT(*) > 1) ;


转载自:http://hi.baidu.com/boy2143/blog/item/e505edf5a889222ebc3109d4.html
分享到:
评论

相关推荐

    用SQL删除重复记录的N种方法

    以上介绍了多种使用SQL删除重复记录的方法,每种方法都有其适用场景和特点。在选择具体方法时,需要考虑数据库的类型、数据量大小以及性能要求等因素。通过合理选择合适的方法,可以有效提高数据清理的效率和准确性...

    在SQL中删除重复记录多种方法

    在SQL中删除重复记录是一个常见的需求,特别是在处理大型数据集时。本文将介绍几种有效的方法,以帮助你在遇到重复记录问题时能有效地清理数据。我们将以Oracle数据库为例,但这些方法在其他SQL数据库系统中也具有...

    DB2 SQL 消息

    - **SQL0064N:** 表示无法删除正在使用的表。 - **SQL0065N:** 表示未知错误。 - **SQL0078N:** 表示未指定表。 - **SQL0079N:** 表示会话模式设置错误。 - **SQL0081N:** 表示预编译时发生错误。 - **SQL0082C:** ...

    java笔记\Oracle里sql不能用limit的处理

    Minus运算符可以用来删除重复的记录,我们可以使用它来删除前面的记录,从而实现分页查询。 例如,以下SQL语句可以查询表t_table_name的第11-20条记录: ```sql SELECT t_col1,t_col2 FROM t_table_name WHERE ...

    经典SQL脚本大全

    │ │ 6.1.2 多表联结导致记录重复的示例.sql │ │ 6.1.3 使用UNION实现库存报表的示例.sql │ │ 6.1.5 按指定上下限区间进行数据统计的示例.sql │ │ 6.1.6 随机出题的示例.sql │ │ 6.2.1 ROLLUP实现的分级...

    oracle快速删除重复的记录

    Oracle 快速删除重复记录 在 Oracle 数据库中,删除重复记录是一项常见的操作,尤其是在大型数据表中。...删除重复记录可以使用多种方法,每种方法都有其优缺点。选择合适的方法取决于具体的应用场景和数据特点。

    用SQL语句添加删除修改字段及一些表与字段的基本操作

    本文将详细介绍如何使用SQL语句来添加、删除和修改表中的字段,以及其他一些基本的操作。 #### 二、增加字段 增加字段使用`ALTER TABLE`语句,其基本格式如下: ```sql ALTER TABLE 表名 ADD 字段名 数据类型; ```...

    学习SQL应知道的动态SQL语句基本语法 mssql

    - **数据操作**:在批量插入、更新或删除数据时,如果操作的表格或记录集不固定,动态SQL可提供解决方案。 **3. MSSQL中的动态SQL基本语法** 在MSSQL中,动态SQL通常通过`EXEC`或`sp_executesql`系统存储过程来执行...

    SQL Server数据库删除数据集中重复数据实例讲解

    首先,为每个重复组分配一个行号,其中最早的记录(根据companyName, invoiceNumber, customerNumber排序)被赋予行号1,其他重复记录将获得更高的行号。然后,我们可以通过删除行号大于1的记录来保留每个组的第一条...

    SQL语句的使用方法大全

    以下是对标题和描述中提到的SQL语句使用方法的详细解释: 1. 数据库备份:在SQL Server中,可以使用`BACKUP DATABASE`语句创建数据库的备份。例如,`BACKUP DATABASE pubs TO testBack`将数据库pubs备份到名为...

    Sqlserver2000经典脚本

    第06章 │ │ 6.1.1 NULL对IN的查询的影响及解决示例.sql │ │ 6.1.2 各种联接的使用示例.sql │ │ 6.1.2 多表联结导致记录重复的示例.sql │ │ 6.1.3 使用UNION实现库存报表的示例.sql │ ...

    sql高级进阶

    - 常用分析函数开窗讲解:详细说明窗口函数的使用方法。 - listagg与小九九:展示如何使用listagg函数进行字符串的聚合。 12. 分层查询 - 树形查询:介绍如何在数据库中查询层次数据。 以上详细知识点是对...

    SQL高级面试题及答案

    - 删除所有非最小ID的重复记录,可以使用子查询和`NOT IN`。 以上是SQL面试中可能遇到的一些高级问题和解答,涵盖了表操作、查询优化、联接、聚合函数、分页、子查询等多个方面,对于理解和掌握SQL的高级用法非常...

    T-SQL语法大全

    **T-SQL**(Transact-SQL)是Microsoft SQL Server使用的SQL方言,它扩展了标准SQL的功能,提供了更强大的数据管理和编程能力。T-SQL由以下几个主要部分组成: 1. **DML(数据操作语言Data Manipulation Language)**: ...

    SQL数据库试题选择填空

    SELECT语句可以实现从指定表或视图中选取数据、去除重复记录(DISTINCT)、连接多个表(UNION)、选取前N条记录(TOP)等功能。 **9. 使用GROUP BY进行分组时,可配合哪些聚合函数使用:** - **A:** ORDER BY, ...

    SQL语句常用汇总

    使用`DISTINCT`关键字可以查询数据库表内不重复的记录。例如: ```sql SELECT DISTINCT 字段名 FROM 数据表; ``` 2. **计数查询**: `COUNT(*)`函数可以计算表中的记录数。如果要按特定字段计数,可以这样做:...

    用SQL语句表与字段的基本操作、数据库备份等

    在本篇内容中,我们将深入探讨如何使用SQL进行表和字段的基本操作,包括添加、删除和修改字段,以及数据库对象的重命名和查询。这些操作对于数据库管理、数据分析以及开发人员来说至关重要。 1. **添加字段**: 要...

    SQL必知必会

    ### SQL必知必会知识点详解 #### 一、适用人群 本资料面向希望理解和学习SQL的人群...以上是关于SQL的基本知识点及使用方法,通过学习这些内容,你可以更好地理解和掌握SQL的基本操作,从而在实际工作中更加得心应手。

    SQL查询语句大全

    #### 十、SQL常用函数及其使用方法 - SQL提供了许多内置函数来帮助进行数据处理,如聚合函数(`SUM`、`AVG`、`MAX`、`MIN`、`COUNT`)、字符串函数(`LEFT`、`RIGHT`、`SUBSTRING`)、日期函数(`GETDATE`、`DATEADD`)等...

    SQL COOKBOOK(压缩1/2)

    4.16删除重复记录 4.17删除从其他表引用的记录 第5章 元数据查询 第6章 使用字符串 第7章 使用数字 第8章 日期运算 第9章 日期操作 第10章 范围处理 第11章 高级查找 第12章 报表和数据仓库运算 第...

Global site tag (gtag.js) - Google Analytics