[摘]在SQL中删除重复记录的多种方法

2023-11-10 21:32

本文主要是介绍[摘]在SQL中删除重复记录的多种方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[摘]在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中,每一条记录都有一个rowidrowid在整个数据库中是唯一的,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中,每一条记录都有一个rowidrowid在整个数据库中是唯一的,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中,每一条记录都有一个rowidrowid在整个数据库中是唯一的,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中,每一条记录都有一个rowidrowid在整个数据库中是唯一的,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中删除重复记录的多种方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/385393

相关文章

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

java String.join()方法实例详解

《javaString.join()方法实例详解》String.join()是Java提供的一个实用方法,用于将多个字符串按照指定的分隔符连接成一个字符串,这一方法是Java8中引入的,极大地简化了... 目录bVARxMJava String.join() 方法详解1. 方法定义2. 基本用法2.1 拼接

java连接opcua的常见问题及解决方法

《java连接opcua的常见问题及解决方法》本文将使用EclipseMilo作为示例库,演示如何在Java中使用匿名、用户名密码以及证书加密三种方式连接到OPCUA服务器,若需要使用其他SDK,原理... 目录一、前言二、准备工作三、匿名方式连接3.1 匿名方式简介3.2 示例代码四、用户名密码方式连接4

springboot项目中使用JOSN解析库的方法

《springboot项目中使用JOSN解析库的方法》JSON,全程是JavaScriptObjectNotation,是一种轻量级的数据交换格式,本文给大家介绍springboot项目中使用JOSN... 目录一、jsON解析简介二、Spring Boot项目中使用JSON解析1、pom.XML文件引入依

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

IDEA中Maven Dependencies出现红色波浪线的原因及解决方法

《IDEA中MavenDependencies出现红色波浪线的原因及解决方法》在使用IntelliJIDEA开发Java项目时,尤其是基于Maven的项目,您可能会遇到MavenDependenci... 目录一、问题概述二、解决步骤2.1 检查 Maven 配置2.2 更新 Maven 项目2.3 清理本

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我