首页 > 数据库 > mysql教程 > 如何在没有唯一标识符的情况下有效地从表中删除重复行?

如何在没有唯一标识符的情况下有效地从表中删除重复行?

Susan Sarandon
发布: 2025-01-23 01:41:08
原创
597 人浏览过

How to Efficiently Remove Duplicate Rows from a Table Without Unique Identifiers?

高效删除无唯一标识符的重复行

当数据表缺少唯一行标识符时,删除重复项可能是一项挑战。本文提供了一种有效的解决方案,用于删除重复行,同时保留第一次出现的行。

让我们来看一个包含重复行的表:

col1 col2 col3 col4 col5 col6 col7
john 1 1 1 1 1 1
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
sally 2 2 2 2 2 2

删除重复行后的期望结果是:

col1 col2 col3 col4 col5 col6 col7
john 1 1 1 1 1 1
sally 2 2 2 2 2 2

使用 CTE 和 ROW_NUMBER 的解决方案

此方法利用公共表表达式 (CTE) 和 ROW_NUMBER() 函数。CTE 根据特定顺序为每一行分配一个序列号 (RN),从而允许我们识别和消除重复项。

以下是带步骤说明的 SQL 查询:

<code class="language-sql">WITH CTE AS (
   SELECT [col1], [col2], [col3], [col4], [col5], [col6], [col7],
       RN = ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col1) -- 为 col1 定义的每个组内分配序列号
   FROM dbo.Table1
)
DELETE FROM CTE WHERE RN > 1; -- 删除 RN 大于 1 的行(表示重复项)</code>
登录后复制

说明:

  • CTE 创建: WITH 语句创建一个名为 CTE 的 CTE,其中包含表的列,并使用 ROW_NUMBER() 函数为每一行分配 RN 值。PARTITION BY 子句根据 col1 列对行进行分组,并在每个组内对它们进行排序以确定顺序。
  • ROW_NUMBER() 函数: ROW_NUMBER() 函数为 PARTITION BY 子句定义的每个分区内的每一行生成一个从 1 开始的序列整数。
  • 删除操作: DELETE 语句删除 CTE 中 RN 大于 1 的行,从而消除重复行。

输出:

执行查询后,更新后的表将包含:

col1 col2 col3 col4 col5 col6 col7
john 1 1 1 1 1 1
sally 2 2 2 2 2 2

以上是如何在没有唯一标识符的情况下有效地从表中删除重复行?的详细内容。更多信息请关注PHP中文网其他相关文章!

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