准备数据
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
分享到:
相关推荐
提供删除数据库中重复记录的经典方法,很不错的资料
Delphi自动删除数据库中重复记录..rar`
在Access中一般只能查找10行大概20条重复记录,这样程序就可以任意指定表及多字段检索重复记录,并把重复的记录移除到一个临时表中,并不是进行真正删除,你可以进行恢复。但是执行第二次查找时则自动删除上次查找的...
在Access中一般只能查找10行大概20条重复记录,这样程序就可以任意指定表及多字段检索重复记录,并把重复的记录移除到一个临时表中,并不是进行真正删除,你可以进行恢复。但是执行第二次查找时则自动删除上次查找的...
基于深度学习的大规模数据库重复记录删除研究.pdf
Oracle数据库删除表中重复记录的方法三则.txt
Oracle数据库删除重复记录的方法
介绍删除数据库中重复数据的几个方法,删除数据库中的重复记录确实是一个比较头痛的问题,希望这些方法能够帮助你
删除Access数据库中重复的记录DeDuplication[DeDuplication.rar]-精品源代码
该文档是本人在实验过程中遇到的一个需求,之后解决了,特此写一个文档,实现一条SQL语句删除数据库某一个表中重复的记录。(重复的记录只保留一条,其他的被删除)
数据库重复记录清除程序VB源码版,删除Access数据库中重复的记录,重复记录在数据库中是无用的,而且还会增大数据库的体积,但是找出这些重复记录如果用人工的话,太麻烦,所以写了这个自动找出重复记录并删除这些...
教你如何在SQL数据库后台通过SQL语句删除重复SQL记录。
sql删除表中重复记录方法,很实用啊,我用过此方法。
通过存储过程,删除Mysql数据库表中的重复记录,只保留一条;
在大型数据库中,有时我们发现自己有成千上万的重复项,因此需要进行自动重复数据删除。 为此,有必要使用一种相当可靠的方法来检测重复项,以找到尽可能多的重复项,并且其功能足以在合理的时间内运行。 本文提出...
可以删除数据库里面表有重复的记录,简洁写法可以复用。谢谢!
在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大rowid的就可以了,其余全部删除。重复记录判断的标准是:C1,C10和C20这三列的值都相同才算是重复记录。
declare @max integer,@id integerdeclare cur_rows cursor local for select id,count(*) from 表名 group by id having count(*) > 1open cur_rowsfetch cur_rows into @id,@maxwhile @@fetch_status=0beginselect...
VB编写的数据库工具删除ACCESS重复记录.rar -------------------------- 在学习vb过程中收集的一些资料,希望对大家有帮助 很多源码或资料,并没有亲自测试,希望朋友们,下载,自行测试, 虽然会有很多代码存在问题,...