首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL删除具有重复值的行,同时保留一个行

问SQL删除具有重复值的行,同时保留一个行
EN

Stack Overflow用户
提问于 2014-05-06 21:13:05
回答 2查看 34.1K关注 0票数 16

假设我有一张桌子

代码语言:javascript
复制
id | data | value
-----------------
 1 |   a  |   A
 2 |   a  |   A
 3 |   a  |   A
 4 |   a  |   B
 5 |   b  |   C
 6 |   c  |   A
 7 |   c  |   C
 8 |   c  |   C

我希望删除每个数据具有重复值的那些行,同时保留具有最小id的行,例如,结果将是

代码语言:javascript
复制
id | data | value
-----------------
 1 |   a  |   A
 4 |   a  |   B
 5 |   b  |   C
 6 |   c  |   A
 7 |   c  |   C

我知道这样做的一种方法是做一个联合,比如:

代码语言:javascript
复制
SELECT 1 [id], 'a' [data], 'A' [value] INTO #test UNION SELECT 2, 'a', 'A'
UNION SELECT 3, 'a', 'A' UNION SELECT 4, 'a', 'B'
UNION SELECT 5, 'b', 'C' UNION SELECT 6, 'c', 'A'
UNION SELECT 7, 'c', 'C' UNION SELECT 8, 'c', 'C'

SELECT * FROM #test WHERE id NOT IN (
    SELECT MIN(id) FROM #test
    GROUP BY [data], [value]
    HAVING COUNT(1) > 1
    UNION
    SELECT MIN(id) FROM #test
    GROUP BY [data], [value]
    HAVING COUNT(1) <= 1
)

但是这个解决方案必须将相同的group重复两次(考虑实际情况是一个> 20列的大型group by )

与复杂的答案相比,我更喜欢代码更少的更简单的答案。有没有更简洁的方式来编码呢?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-06 21:16:19

您可以使用以下方法之一:

使用WITH CTE的

  1. :

WITH CTE AS (SELECT *,RN=ROW_NUMBER() OVER(PARTITION BY data,value BY id) FROM TableName) DELETE FROM CTE WHERE RN>1

说明:

该查询将选择表的内容以及行号RN。然后删除RN >1的记录(可能是重复的)。

显示使用此方法要删除的记录。

使用NOT IN的

  1. :

DELETE FROM TableName WHERE id NOT IN (SELECT MIN( id ) as id FROM TableName GROUP BY data,value)

Explanation:

对于给定的示例,内部查询将返回ids (1,6,4,5,7)。外部查询将从表中删除id 不在 (1,6,4,5,7)中的记录。

显示使用此方法要删除的记录。

建议:使用第一种方法,因为它比后者更快。此外,如果相同的data和value的id字段也是重复的,则它会设法只保留一条记录。

票数 26
EN

Stack Overflow用户

发布于 2019-02-27 19:01:16

我想为此查询添加MYSQL解决方案

建议1: 8.0版之前的MySQL不支持WITH子句

建议2:抛出此错误(不能在FROM子句中为update指定表TableName

因此解决方案将是

代码语言:javascript
复制
DELETE FROM TableName WHERE id NOT IN
  (SELECT MIN(id) as id
   FROM (select * from TableName) as t1
   GROUP BY data,value) as t2;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23495734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档