2009-08-17 126 views
11

我有一个在名称列中有很多重复的表。我想 喜欢只保留每一行。如何只保留一行表,删除重复行?

下面列出的重复,但我不知道如何删除 重复,只是保持一个:

SELECT name FROM members GROUP BY name HAVING COUNT(*) > 1; 

谢谢。

回答

26

请参阅以下问题:Deleting duplicate rows from a table

从那里适应接受的答案(这是我的答案,所以没有“盗窃”这里...):

你可以做一个简单的方法假设你有一个独特的ID字段:您可以删除除ID以外的所有记录相同,但没有“最小ID”作为其名称。

例子查询:

DELETE FROM members 
WHERE ID NOT IN 
(
    SELECT MIN(ID) 
    FROM members 
    GROUP BY name 
) 

如果你没有一个唯一索引,我的建议是简单地添加自动增量唯一索引。主要是因为它是很好的设计,但也因为它可以让你运行上面的查询。

+1

以下是我对上述内容的理解:对于每个名称,它将它们分组(如果唯一,则为一个;如果重复,则为多个),从该集合中选择最小的ID,然后删除表中不存在ID的任何行。 辉煌:)非常感谢Rax。 – Gulbahar 2009-08-17 09:16:52

+0

你明白了:) – 2009-08-17 09:19:32

+1

在mysql发送这个查询时出现以下错误:'“错误1093(HY000),但它给出了一个错误'你不能指定目标表'成员'在FROM子句中更新”'任何想法? – 2011-02-21 18:07:38

4

将新表中的独特元素选中,删除旧表,然后重命名临时表以替换它,可能会更容易。

#create a table with same schema as members 
CREATE TABLE tmp (...); 

#insert the unique records 
INSERT INTO tmp SELECT * FROM members GROUP BY name; 

#swap it in 
RENAME TABLE members TO members_old, tmp TO members; 

#drop the old one 
DROP TABLE members_old; 
+0

谢谢保罗。对于那些有兴趣... CREATE TEMP TABLE tmp_members(name VARCHAR); INSERT INTO tmp_members SELECT name FROM members GROUP BY name; SELECT COUNT(name)FROM tmp_members; DELETE FROM members; VACUUM会员; SELECT COUNT(name)FROM members; INSERT INTO成员(名称)SELECT * FROM tmp_members; SELECT COUNT(name)FROM members; SELECT DISTINCT COUNT(name)FROM members; SELECT name FROM members LIMIT 10; DROP TABLE tmp_members; – Gulbahar 2009-08-17 09:11:01

+0

对不起,我错过了你正在使用SQLite! – 2009-08-17 09:14:11

0

我们有一个巨大的数据库,其中删除重复项是常规维护过程的一部分。我们使用DISTINCT来选择唯一的记录,然后将它们写入到TEMPORARY TABLE中。在TRUNCATE之后,我们将TEMPORARY数据写回到TABLE中。

这是做它的一种方式,并作为存储过程。

+1

我不得不承认Rax Olgud的答案要复杂得多,而且可能会快100倍! :) - 我正在考虑采用解决方案... 值得+1! – 2009-08-17 13:00:12

0

如果我们想先查看您即将删除的行,然后删除它们。

with MYCTE as (
    SELECT DuplicateKey1 
     ,DuplicateKey2 --optional 
     ,count(*) X 
    FROM MyTable 
    group by DuplicateKey1, DuplicateKey2 
    having count(*) > 1 
) 
SELECT E.* 
FROM MyTable E 
JOIN MYCTE cte 
ON E.DuplicateKey1=cte.DuplicateKey1 
    AND E.DuplicateKey2=cte.DuplicateKey2 
ORDER BY E.DuplicateKey1, E.DuplicateKey2, CreatedAt 

完整的示例在http://developer.azurewebsites.net/2014/09/better-sql-group-by-find-duplicate-data/

0

删除DUP行保持一个 表中有重复的行,可能是某些行没有重复的行然后保持一个行,如果表中有重复或单。 表有两个列ID和名称,如果我们必须从表 删除重复的名称并保留一个。它在我的最后工作很好你必须使用这个查询。

DELETE FROM tablename 
WHERE id NOT IN(

SELECT id FROM 
(
    SELECT MIN(id)AS id 
    FROM tablename 
    GROUP BY name HAVING 
    COUNT(*) > 1 
)AS a) 
AND id NOT IN(
(SELECT ids FROM 
(
SELECT MIN(id)AS ids 
    FROM tablename 
    GROUP BY name HAVING 
    COUNT(*) =1 
)AS a1 
) 
) 

之前删除表见下面的截图: enter image description here 删除表后,请参见下面的截图此查询删除阿米特和AKHIL重复行,并保持一个记录(阿密特和AKHIL):

enter image description here

0

您可以通过匹配场连接表与自己并删除不匹配行

DELETE t1 FROM table_name t1 
LEFT JOIN tablename t2 ON t1.match_field = t2.match_field 
WHERE t1.id <> t2.id; 
相关问题