假设我有一张桌子
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的行,例如,结果将是
id | data | value
-----------------
1 | a | A
4 | a | B
5 | b | C
6 | c | A
7 | c | C我知道这样做的一种方法是做一个联合,比如:
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 )
与复杂的答案相比,我更喜欢代码更少的更简单的答案。有没有更简洁的方式来编码呢?
谢谢
发布于 2014-05-06 21:16:19
您可以使用以下方法之一:
使用WITH CTE的
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的
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字段也是重复的,则它会设法只保留一条记录。
发布于 2019-02-27 19:01:16
我想为此查询添加MYSQL解决方案
建议1: 8.0版之前的MySQL不支持WITH子句
建议2:抛出此错误(不能在FROM子句中为update指定表TableName
因此解决方案将是
DELETE FROM TableName WHERE id NOT IN
(SELECT MIN(id) as id
FROM (select * from TableName) as t1
GROUP BY data,value) as t2;https://stackoverflow.com/questions/23495734
复制相似问题