如何只保留一行表,删除重复的行?

时间:2009-08-17 08:49:16

标签: sql sqlite duplicates

我有一个表在Name列中有很多重复项。 ID 比如每个只保留一行。

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

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

谢谢。

8 个答案:

答案 0 :(得分:35)

请参阅以下问题: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 :(得分: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;

答案 2 :(得分:0)

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

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

答案 3 :(得分: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/

的完整示例

答案 4 :(得分:0)

删除重复行保留一个 table有重复的行,可能是某些行没有重复的行,如果表中有重复或单个行,它会保留一行。 如果我们必须从表中删除重复的名称,表有两个列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 删除表之后是下面看截图这个查询删除amit和akhil重复行并保留一条记录(amit和akhil):

enter image description here

答案 5 :(得分:0)

您可以通过匹配字段与自己联系并删除不匹配的行

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

答案 6 :(得分: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;

答案 7 :(得分:-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