`

用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

分享到:
评论

相关推荐

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

    另一种方法是通过自连接来删除重复记录,例如: ```sql DELETE FROM employee e1 WHERE EXISTS ( SELECT 1 FROM employee e2 WHERE e1.emp_id = e2.emp_id AND e1.emp_name = e2.emp_name AND e1.salary = e2....

    oracle快速删除重复的记录

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

    DB2 SQL 消息

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

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

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

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

    本文将通过一个具体的实例来讲解如何使用SQL语句来删除重复数据。 首先,假设我们有一个名为`@InvoiceListMaster`的临时表,该表包含了公司名称(companyName)、发票号码(invoiceNumber)和客户编号...

    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实现的分级...

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

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

    SQL语句的使用方法大全

    17. 删除重复记录:删除重复记录通常涉及使用`GROUP BY`和`HAVING`子句,或者通过自连接和`DISTINCT`关键字来实现。 以上是SQL语句的一些常见用途和示例,它们在数据库管理、数据分析以及应用开发中扮演着重要角色...

    SQL高级面试题及答案

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

    SQL语句常用汇总

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

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

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

    Visual FoxPro中SQL命令语法及示例

    删除表中的记录可以用以下命令: ```sql DELETE FROM 课程 WHERE 课程号 = 1; ``` #### 8. 数据查询 (SELECT) - **8.1 Select命令各子句执行顺序** SELECT命令的执行顺序通常为FROM -&gt; WHERE -&gt; GROUP BY -...

    SQL数据库试题选择填空

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

    sql高级进阶

    - 删除名称重复的记录:结合窗口函数或自关联删除重复项。 5. 使用字符串 - 遍历字符串:利用数据库函数逐个处理字符串中的字符。 - 字符串文字中包含引号:使用转义字符处理引号。 - 计算字符在字符串中出现的...

    SQL COOKBOOK(压缩1/2)

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

    数据库 创建索引 sql oracle

    * 用 Transact-SQL 语句创建索引:使用 CREATE INDEX 语句创建索引,例如 CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ...n ] ) [ WITH [PAD_...

Global site tag (gtag.js) - Google Analytics