`

删除数据库中的重复记录

阅读更多
准备数据

MySQL的表名和字段名默认为小写。
如果需要大写,使用`将表名或字段名括起来:
-- Clear first
DROP TABLE IF EXISTS `tb_score`;

-- Create the table 
CREATE TABLE `tb_score`(
       `id` mediumint,
       `name` varchar(20),
       `course` varchar(30),
       `score` smallint
);

-- Batch insert, supported by MySQL and DB2
INSERT INTO tb_score
    (id, name, course, score)
VALUES
    (1, 'John', 'Biology', 90),
    (2, 'John', 'Biology', 90),
    (3, 'Lisa', 'Chemistry', 80),
    (4, 'John', 'Biology', 90);


DB2



数据库中存在重复记录分为两种:

第一种情形、某些字段的值相同
第二种情形、所有字段的值相同

下面是通用SQL语句,对所有关系型数据库的一和二情形都适用:

查询重复记录,比如姓名-课程出现重复:
SELECT
    name,
    course,
    COUNT(*) AS "count"
FROM
    tb_score
GROUP BY
    name,
    course
HAVING
    COUNT(*) > 1

结果:
+------+---------+-------+
| name | course  | count |
+------+---------+-------+
| John | Biology |     3 |
+------+---------+-------+

在上面基础上,查询所有的重复记录:
SELECT
    *
FROM
    tb_score a
WHERE
    (
        a.name, a.course) IN
    (
        SELECT
            b.name,
            b.course
        FROM
            tb_score b
        GROUP BY
            b.name,
            b.course
        HAVING
            COUNT(1) > 1)

结果:
+------+------+---------+-------+
| id   | name | course  | score |
+------+------+---------+-------+
|    1 | John | Biology |    90 |
|    2 | John | Biology |    90 |
|    4 | John | Biology |    90 |
+------+------+---------+-------+


第一种情形:

a. 采用普通SQL连接的方式,条件是这些字段的值相同,并且其它字段的值大于或小于对应字段的值(只能取一种,等于表示同一条记录)

查询多余的重复记录:
SELECT
    *
FROM
    tb_score a
WHERE
    EXISTS
    (
        SELECT
            1
        FROM
            tb_score b
        WHERE
            a.name=b.name
        AND a.course=b.course
        AND a.id > b.id)

结果:
+------+------+---------+-------+
| id   | name | course  | score |
+------+------+---------+-------+
|    2 | John | Biology |    90 |
|    4 | John | Biology |    90 |
+------+------+---------+-------+

删除多余的重复记录:
-- MySQL doesn't support
DELETE
FROM
    tb_score a
WHERE
    EXISTS
    (
        SELECT
            1
        FROM
            tb_score b
        WHERE
            a.name = b.name
        AND a.course = b.course
        AND a.id > b.id)


b. 采用特定于数据库的SQL语句,和第二种情形的写法类似。

第二种情形

不同的数据库有不同的解决方案,SQL Server是用DISTINCT关键字,Oracle是ROWID,DB2是ROW_NUMBER OVER(PARTITION BY [FIELDS] ORDER BY [FIELDS])

准备数据:
-- Drop and create table are omitted
-- Batch insert
INSERT INTO tb_score
    (id, name, course, score)
VALUES
    (1, 'John', 'Biology', 90),
    (1, 'John', 'Biology', 90),
    (2, 'Lisa', 'Chemistry', 80),
    (1, 'John', 'Biology', 90);


SQL Server
删除多余的重复记录:
CREATE TABLE
    #tmp AS
SELECT DISTINCT
    *
FROM
    tb_score;
    
TRUNCATE TABLE
    tb_score;
    
INSERT
INTO
    tb_score
SELECT
    *
FROM
    #tmp;


Oracle
查询多余的重复记录:
SELECT
    *
FROM
    tb_score a
WHERE
    a.ROWID >
    (
        SELECT
            MIN(ROWID)
        FROM
            tb_score b
        WHERE
            a.id = b.id
        AND a.name = b.name
        AND a.course = b.course)


删除多余的重复记录:
DELETE
FROM
    tb_score a
WHERE
    a.ROWID >
    (
        SELECT
            MIN(ROWID)
        FROM
            tb_score b
        WHERE
            a.id = b.id
        AND a.name = b.name
        AND a.course = b.course)


DB2
查询多余的重复记录:
SELECT
    id,
    name,
    course
FROM
    (
        SELECT
            id,
            name,
            course,
            ROW_NUMBER() OVER(PARTITION BY id, name, course) AS row_seq
        FROM
            tb_score) t
WHERE
    t.row_seq > 1


删除多余的重复记录:
DELETE
FROM
    (
        SELECT
            id,
            name,
            course,
            ROW_NUMBER() OVER(PARTITION BY id, name, course) AS row_seq
        FROM
            tb_score) t
WHERE
    t.row_seq > 1
分享到:
评论

相关推荐

    怎样删除数据库中重复记录

    删除数据库中重复记录的经典方法 删除数据库中重复记录是数据库管理中一个常见的问题,特别是在数据量庞大的时候。今天,我们将讨论删除数据库中重复记录的经典方法,包括使用 SQL 语句和其他技巧。 查找表中多余...

    Delphi自动删除数据库中重复记录..rar

    这个压缩包文件"Delphi自动删除数据库中重复记录.."提供了一个解决方案,可能是通过 Delphi 代码来实现对数据库中重复记录的自动检测和删除。在本文中,我们将深入探讨 Delphi 与数据库交互的基本原理,以及如何编写...

    基于深度学习的大规模数据库重复记录删除研究.pdf

    深度学习算法在大规模数据库重复记录删除中的应用研究是一个热点领域,因为数据库重复记录删除具有较高的实际应用价值。当前,大多数单位和机构都构建了相应的数据库管理系统,以提高工作效率。然而,随着业务数据的...

    删除Access数据库中重复的记录

    在Access中一般只能查找10行大概20条重复记录,这样程序就可以任意指定表及多字段检索重复记录,并把重复的记录移除到一个临时表中,并不是进行真正删除,你可以进行恢复。但是执行第二次查找时则自动删除上次查找的...

    删除数据库中重复的数据(只保留一条)

    在数据库管理过程中,经常会遇到需要清理数据的情况,其中一种常见需求就是删除数据库中的重复记录,同时确保每条数据的关键字段只保留一条记录。这种操作在维护数据一致性、提高查询效率等方面具有重要意义。根据...

    VB删除Access数据库中重复记录(已测试,编译通过)

    在Access中一般只能查找10行大概20条重复记录,这样程序就可以任意指定表及多字段检索重复记录,并把重复的记录移除到一个临时表中,并不是进行真正删除,你可以进行恢复。但是执行第二次查找时则自动删除上次查找的...

    删除Access数据库中重复的数据

    5. **删除重复数据**:在确认了要删除的重复记录后,可以使用Access的“删除查询”功能来移除它们。但请注意,删除操作是不可逆的,因此在执行前务必备份数据。 6. **自动化过程**:如果经常需要进行此操作,可以...

    Oracle数据库删除表中重复记录的方法三则.txt

    这种方法适用于仅需删除重复记录中的部分行,而保留至少一行的情况。通过比较不同记录的ROWID来确定哪些记录是重复的,并利用子查询找出这些重复记录的最大ROWID,然后将其删除。 **SQL示例代码:** ```sql DELETE...

    删除数据表中重复记录

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

    实例介绍删除数据库中重复数据的几个方法

    在数据库管理过程中,删除重复记录是一项常见的需求,特别是当数据库中存在大量的冗余数据时,这不仅浪费存储空间,还可能导致查询性能下降以及数据的一致性问题。本文将详细介绍两种常见的删除数据库中重复数据的...

    wxh Oracle数据库删除重复记录的方法

    根据给定的文件标题、描述和部分内容,我们可以深入探讨Oracle数据库中删除重复记录的方法,这对于维护数据完整性和提高系统性能至关重要。以下将详细介绍几种在Oracle数据库中有效删除重复记录的技术。 ### 1. ...

    清除SQL数据库里的重复记录

    - 假设我们决定保留每组重复记录中ID最小的那个,可以这样做: ```sql DELETE FROM employees WHERE employee_id NOT IN ( SELECT MIN(employee_id) FROM employees GROUP BY email ); ``` - 这个查询...

    删除Access数据库中重复的记录DeDuplication[DeDuplication.rar]-精品源代码

    描述中提到的是一个名为“DeDuplication”的源代码,这可能是一个VB(Visual Basic)或VB.NET项目,用于处理Access数据库中的重复记录问题。VB是Microsoft的一种面向对象的编程语言,常用于开发Windows应用程序,而...

    sql删除表中重复记录方法

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

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

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

    如何高效删除Oracle数据库中的重复数据

    - **解释**:这种方法利用ROWID来直接删除除每组中的最大ROWID外的所有重复记录。 2. **使用临时表** - **示例代码**: ```sql CREATE TABLE temp_table AS SELECT column1, column2, MAX(rowid) dataid FROM...

    易语言数据库是否重复

    在易语言中,我们通常会使用“数据库”类库来执行数据库操作,包括连接数据库、执行SQL语句、查询数据、插入数据、更新数据以及删除数据等。 1. **连接数据库**: 易语言中,可以使用“建立数据库连接”命令创建与...

    数据库 查询删除重复数据

    数据库查询删除重复数据是数据库管理中的一项重要操作,旨在查找和删除表中的重复记录。重复记录是根据单个字段或多个字段来判断的。下面介绍几种查找和删除重复记录的方法。 根据单个字段查找和删除重复记录 可以...

    数据库重复记录清除程序VB源码版.rar

    数据库重复记录清除程序VB源码版,删除Access数据库中重复的记录,重复记录在数据库中是无用的,而且还会增大数据库的体积,但是找出这些重复记录如果用人工的话,太麻烦,所以写了这个自动找出重复记录并删除这些...

Global site tag (gtag.js) - Google Analytics