19

我有一个在名称列中有很多重复项的表。我只想为每个保留一行。

以下列出了重复项,但我不知道如何删除重复项并只保留一个:

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

谢谢你。

4

9 回答 9

49

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

改编后接受的答案(这是我的答案,所以这里没有“盗窃”......):

假设您有一个唯一的 ID 字段,您可以通过简单的方式执行此操作:您可以删除除 ID 之外的所有相同的记录,但它们的名称没有“最小 ID”。

示例查询:

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

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

于 2009-08-17T09:01:09.357 回答
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;
于 2009-08-17T08:53:01.183 回答
0

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

这是一种方法,并且作为存储过程工作。

于 2009-08-17T09:06:30.187 回答
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/

于 2016-09-05T18:56:55.740 回答
0

删除重复行保留一个 表有重复的行,并且可能有些行没有重复的行,然后如果表中有重复或单行,则保留一行。如果我们必须从表中删除重复的名称并保留一个,则表有两个列 id 和 name。它在我的最后工作正常你必须使用这个查询。

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
)
)

在下面删除表之前请参见屏幕截图: 在此处输入图像描述在 下面删除表之后请参见屏幕截图此查询删除 amit 和 akhil 重复行并保留一条记录(amit 和 akhil):

在此处输入图像描述

于 2017-02-10T09:06:08.697 回答
0

您可以通过匹配字段与自己连接表格并删除不匹配的行

DELETE t1 FROM table_name t1 
LEFT JOIN tablename t2 ON t1.match_field = t2.match_field
WHERE t1.id <> t2.id;
于 2017-07-17T19:23:13.393 回答
0

如果要从表中删除重复记录。

CREATE TABLE tmp SELECT lastname, firstname, sex
FROM user_tbl;
GROUP BY (lastname, firstname);

DROP TABLE user_tbl;

ALTER TABLE tmp RENAME TO user_tbl;
于 2019-02-02T10:21:21.187 回答
0

演出记录 SELECT page_url,count() FROM wl_meta_tags GROUP BY page_url HAVING count() > 1

删除记录 源地址 DELETE FROM wl_meta_tags WHERE meta_id NOT IN( SELECT meta_id FROM ( SELECT MIN(meta_id)AS meta_id FROM wl_meta_tags GROUP BY page_url HAVING COUNT() > 1 )AS a ) AND meta_id NOT IN( (SELECT ids FROM ( SELECT MIN(meta_id)AS ids FROM wl_meta_tags GROUP BY page_url HAVING COUNT() =1 )AS a1 ) )

于 2021-08-19T11:49:52.453 回答
-1
WITH CTE AS
(
    SELECT ROW_NUMBER() OVER (PARTITION BY [emp_id] ORDER BY [emp_id]) AS Row, * FROM employee_salary
)


DELETE FROM CTE
WHERE ROW <> 1
于 2018-10-02T10:56:09.240 回答