如何去掉数据库重复记录并且只保留一条记录

说白了,使用SQL去重、保留记录的关键就是使用GROUP BY和MIN()/MAX() with NOT IN。
这件事的复杂性在于ROWID的选择,这取决于数据库类型。

我们先来说说最重要的事情。
对于单个字段(如 peopleId)的重复数据删除,只需使用 MIN() 查找最小的 ROWID。
去年我们跑了一个电商项目,表中有几百万用户数据。
使用 DELETE FROM table WHERE id IN (...) 和 MIN(id) 比临时表快 3 0%。
请记住添加 WHERE id > MIN(id) 以进行进一步优化。
还有一点,如果字段是字符串类型,不要忘记使用GROUP BY peopleId COLLATE NOCASE,防止大小写导致重复。

还有另一个重要的细节。
对多个字段进行重复数据删除时(例如您的 peopleId+seq 示例),必须同时使用 GROUP BY 和 HAVING COUNT() > 1 去年我运行那个ERP系统的时候,仅仅添加GROUP BY就差点被数据库卡住了,因为全表扫描太暴力了。
一开始我以为用DISTINCT就可以了,后来发现不对,只好用group count来过滤。
等等,那是另一回事了。
在某些数据库(例如旧版本的 MySQL)中,MIN() 不能直接应用于多个列。
您必须首先使用子查询将字段包装到临时表中。

关于陷阱的提醒:删除时使用 NOT IN 时要小心。
在极端情况下,可以锁定整个表。
上次我在大表上使用此方法时,运维抱怨 CPU 飙升至 9 5 %。
建议首先运行 SELECT 以验证 ROWID 未损坏。

很多人没有注意到这一点。
ROWID不一定会在数值上增加,特别是在有分库、分表、软删除的场景下。
我认为临时表方法值得尝试。
先用ROWID创建临时表,再用INSERT INTO...SELECT DISTINCT...,最后TRUNCATE原表,比IN/NOT IN操作更稳定。

sql server 表中重复数据只留一条

说白了,保留OID最小的重复数据是最简单的。

上周我也遇到了类似的问题。
最安全的方法是:
1 开办企业 2 、备份原表数据 3 . 请求双倍 Sp_Nr。
关闭 sql SELECT Sp_no, COUNT() cnt FROM your_table GROUP BY Sp_no HAVING cnt > 1
4 找到最小的OID sql SELECT MIN(Oid) AS min_oid FROM your_table WHERE Sp_no = 'your_sp_no'
5 .删除多余记录 sql 从 your_table 中删除 WHERE Sp_no = 'your_sp_no' AND Oid NOT IN (SELECT MIN(Oid) FROM your_table WHERE Sp_no = 'your_sp_no')
6 .提交交易
关键是OID必须是唯一的。
亲自看看,这是最干净的处理方法。

在mysql数据库中如何让某个字段有重复的只取一条