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

上周有个客人问我处理SQL Server表中重复数据的方法,我就跟他说了这么一套流程。
首先,你肯定得保证数据安全,所以得先备份数据库。
这步很重要,万一操作出错,至少数据还在。

然后,你开始一个事务操作,这样如果后面出什么问题,可以回滚,不会影响到数据。
接着,你把原表的数据备份到一个新表里,这样不会影响到原始数据。

接下来,你要找到重复的数据。
你可以用SQL语句来查询,找一找Sp_no字段有哪些是重复的。

确定了重复数据之后,你就要决定保留哪些。
你可以再查询一遍,找出每个Sp_no对应的最小Oid值,这个值就是你打算保留的数据的Oid。

然后,你要筛选出需要删除的数据。
也就是说,除了每个Sp_no下最小的Oid值对应的记录之外,其他的重复数据都要删除。

最后,执行删除操作。
这一步很重要,要确保只删除了多余的重复数据,保留下了每个Sp_no下一条具有最小Oid的记录。

这套流程操作起来还是挺简单的,关键是得一步一步来,不能急。
数据安全跟完整性是关键,得保证这两点。
反正你看着办,按照这个流程来,一般不会有太大问题。
我还在想这个问题,如果有什么更好的方法,我还会继续学习的。

Oracle删除重复记录只保留一条数据的几种方法

1 、要找单个字段Id的重复记录,直接用这个SQL:SELECT FROM 表 WHERE Id IN (SELECT Id FROM 表 GROUP BY Id HAVING COUNT(Id) > 1 ); 2 、要删掉单个字段Id的重复记录,只留RowID最小的,这样写:DELETE FROM 表 WHERE (Id) IN (SELECT Id FROM 表 GROUP BY Id HAVING COUNT(Id) > 1 ) AND ROWID NOT IN (SELECT MIN(ROWID) FROM 表 GROUP BY Id HAVING COUNT() > 1 ); 3 、要找多个字段(比如Id和seq)的重复记录,就用这个SQL:SELECT FROM 表 a WHERE (a.Id, a.seq) IN (SELECT Id, seq FROM 表 GROUP BY Id, seq HAVING COUNT() > 1 ); 4 、要删掉多个字段(Id和seq)的重复记录,只留RowID最小的,这样操作:DELETE FROM 表 a WHERE (a.Id, a.seq) IN (SELECT Id, seq FROM 表 GROUP BY Id, seq HAVING COUNT() > 1 ) AND ROWID NOT IN (SELECT MIN(ROWID) FROM 表 GROUP BY Id, seq HAVING COUNT() > 1 ); 5 、要找多个字段(Id和seq)的重复记录,但不包括RowID最小的,这个SQL行:SELECT FROM 表 a WHERE (a.Id, a.seq) IN (SELECT Id, seq FROM 表 GROUP BY Id, seq HAVING COUNT() > 1 ) AND ROWID NOT IN (SELECT MIN(ROWID) FROM 表 GROUP BY Id, seq HAVING COUNT() > 1 );
记得在实际操作前先备份数据哦,别删错了重要的记录。

SQL中删除重复记录只保留一条的语句,最好有详细解释。

说白了,Oracle和MySQL删除重复记录的方法各有千秋。
其实很简单,Oracle是利用Rowid的独特性来操作,而MySQL则是通过创建新表来避免重复。

先说最重要的,Oracle的方法是利用Rowid来删除重复记录。
Rowid是一个虚列,不是真正的表中的列,但它具有唯一性。
去年我们跑的那个项目,大概3 000量级的数据量,就是用这个方法删除了重复记录。
具体操作是delete from test1 where rowid not in (select max(rowid) from test1 );。
这个操作相当于删除了除了每个记录组中Rowid最大的记录之外的所有记录。

另外一点,MySQL的思路是先创建一个新表,只包含唯一的记录,然后替换原表。
比如,create table test2 as select distinct from test1 ;这行命令就会创建一个新表,包含原表的所有唯一记录。
然后,drop table test1 ;删除原表,最后alter table test2 rename to test1 ;将新表重命名为原表的名称。
这个操作其实挺坑的,因为如果原表数据量很大,这个过程可能会很慢。

我一开始也以为MySQL的方法比较复杂,后来发现其实很简单,关键在于理解如何利用distinct关键字和新表操作。
等等,还有个事,这个过程中要注意的是,如果原表中有外键依赖,直接删除原表可能会导致问题。
所以在实际操作中,需要先处理好这些依赖关系。

所以,如果你在处理大量数据,且不需要保留原表的结构,Oracle的方法可能更高效。
但如果你需要保留原表结构,或者数据量不大,MySQL的方法也是一个不错的选择。
你觉得哪种方法更适合你的需求呢?

sql删除重复数据且只保留一条?

对,就是这意思。
用SELECT MIN(id) FROM table GROUP BY title找出每个title的最小id。
WHERE id NOT IN那部分能筛选出不在最小id列表里的id,比如2 7 3 3 和2 7 3 4 然后删除这些id对应的行。
注意,如果title字段重复,不一定整行都重复,得确认一下。