首页 > 数据库 > mysql教程 > 如何在SQL中高效删除表中的重复行?

如何在SQL中高效删除表中的重复行?

Mary-Kate Olsen
发布: 2025-01-19 02:47:08
原创
162 人浏览过

How to Efficiently Delete Duplicate Rows from a Table in SQL?

SQL:消除表中的重复行

挑战:

您面临着一个缺少主键或约束的表,其中包含多行具有相同数据的行。 目标是删除重复的行,仅保留每个唯一行的一个实例。我们将使用名为“key”的列来识别重复项,确保每个不同的“key”值仅存在一个条目。

解决方案:

此过程涉及两个关键步骤:

  1. 识别第一次出现:找到每个重复行的初始实例。
  2. 删除后续重复项:删除第 1 步中识别的不是第一次出现的所有行。

以下 SQL 命令可以完成此操作:

<code class="language-sql">DELETE FROM dups a USING (
    SELECT MIN(ctid) as ctid, key
    FROM dups 
    GROUP BY key HAVING COUNT(*) > 1
) b
WHERE a.key = b.key 
AND a.ctid <> b.ctid;</code>
登录后复制

重要提示:此方法无法控制保留哪个特定行。

示例:

考虑这个示例表:

<code class="language-sql">CREATE TABLE people (
    name    varchar(50) NOT NULL,
    surname varchar(50) NOT NULL,
    age     integer NOT NULL
);

INSERT INTO people (name, surname, age) VALUES 
    ('A.', 'Tom', 30),
    ('A.', 'Tom', 10),
    ('B.', 'Tom', 20),
    ('B', 'Chris', 20);</code>
登录后复制

查找第一次出现的重复项:

<code class="language-sql">SELECT MIN(ctid) as ctid, name, surname
FROM people 
GROUP BY (name, surname) HAVING COUNT(*) > 1;</code>
登录后复制

输出:

ctid name surname
(0,1) A. Tom

删除非第一个重复项:

<code class="language-sql">DELETE FROM people a USING (
    SELECT MIN(ctid) as ctid, name, surname
    FROM people 
    GROUP BY (name, surname) HAVING COUNT(*) > 1
) b
WHERE a.name = b.name
AND a.surname = b.surname
AND a.ctid <> b.ctid;</code>
登录后复制

剩余行:

<code class="language-sql">SELECT * FROM people;</code>
登录后复制

输出:

name surname age
A. Tom 30
B. Tom 20
B Chris 20

以上是如何在SQL中高效删除表中的重复行?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板