如何删除重复行?

1373
我需要从一个相当大的SQL Server表(即300,000个以上的行)中删除重复的行。 当然,由于存在RowID标识字段,这些行不会是完全重复的。 MyTable
RowID int not null identity(1,1) primary key,
Col1 varchar(20) not null,
Col2 varchar(2048) not null,
Col3 tinyint not null

我该怎么做?


15
针对读者使用PostgreSQL的快速提示(很多人经常被链接到这里):Pg不会将CTE项暴露为可更新的视图,因此您无法直接从CTE项中进行“DELETE FROM”操作。请参见https://dev59.com/s2Ml5IYBdhLWcg3wZGPo。 - Craig Ringer
@CraigRinger 对于 Sybase 来说也是一样的 - 我已经在这里汇总了其余的解决方案(对于PG和其他系统也应该适用:https://dev59.com/SHjZa4cB1Zd3GeqPcU6J (如果有的话)只需将ROWID()函数替换为RowID列即可)。 - maf-soft
14
这里需要加上一个警告。在运行去重过程时,一定要先仔细检查你要删除的内容!这是一个常见的错误,很容易误删好数据的领域之一。 - Jeff Davis
43个回答

-1

在PostgreSQL中删除表中重复行的非常简单的方法。

DELETE FROM table1 a
USING table1 b
WHERE a.id < b.id
AND a.column1 = b.column1
AND a.column2 = b.column2;

-1
创建另一个表,该表将包含原始值:
CREATE TABLE table2 AS SELECT *, COUNT(*) FROM table1 GROUP BY name HAVING COUNT (*) > 0

-1

删除重复记录

在这种情况下,大于运算符将删除除第一条记录以外的所有记录

DELETE u1 FROM users u1 JOIN users u2 WHERE u1.id > u2.id AND u1.email=u2.email

在这种情况下,小于运算符将删除除最后一条记录以外的所有记录

DELETE u1 FROM users u1 JOIN users u2 WHERE u1.id < u2.id AND u1.email=u2.email


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接