大家好,又见面了,我是你们的朋友全栈君。
目录
概述
一、Oracle数据库去重(推荐放在在第6点)
二、MySQL数据库去重
三、sqlserver数据库去重
四、pg数据库删除重复数据
2、实现方法一:通过分组后,拿最小的id重复删除
<code style="margin-left:0"> delete from hwb a where a.id in (select min(id) FROM hwb a group by name having count(name) > 1)</code>
3、实现方法二:通过name相同,id不同的方式来判断
<code style="margin-left:0">DELETE FROM hwb a WHERE EXISTS (SELECT 1 FROM hwb b WHERE a.name = b.name AND a.id > b.id);</code>
4、实现方法三:用rowid代替id,替换删除
<code style="margin-left:0">DELETE FROM hwb a WHERE EXISTS (SELECT 1 FROM hwb b WHERE a.name = b.name AND a.rowid > b.rowid);</code>
5、实现方法四:通过分析函数根据name分组生成序号,然后删除序号大于1的数据。
语法格式:row_number() over(partition by 分组列 order by 排序列 desc)
在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by、 order by 的执行。
<code style="margin-left:0">DELETE FROM hwb a WHERE ROWID IN (SELECT rid FROM (SELECT ROWID as rid, ROW_NUMBER() OVER(PARTITION BY name ORDER BY id) AS seq FROM hwb) WHERE seq > 1);</code>
6、【推荐】实现方法五:根据rowid删除
<code style="margin-left:0">DELETE FROM hwb a WHERE a.ROWID > (SELECT MIN(b.ROWID) FROM hwb b WHERE a.name = b.name);</code>
3、实现方法二:
根据name分组,查找出id最小的,然后再查找id不包含刚才查出来的。这样就查询出了所有的重复数据(除了id最小的那行)
<code style="margin-left:0">delete from hwb WHERE id NOT IN (select tt.id from (SELECT min(c.id ) as id FROM hwb c GROUP BY NAME ) tt)</code>
4、实现方法三:通过name相同,id不同的方式来判断
<code style="margin-left:0">delete from hwb where id in ( select id from ( select * from hwb a WHERE EXISTS (SELECT 1 FROM hwb b WHERE a.name = b.name AND a.id > b.id))c );</code>
5、实现方法四:用rowid代替id,替换删除
在 Oracle 数据库的表中的每一行数据都有一个唯一的标识符,称为 rowid ,在 Oracle 内部通常就是使用它来访问数据的。
而在 MySQL 中也有一个类似的隐藏列 _rowid 来标记唯一的标识。但是需要注意 _rowid 并不是一个真实存在的列,其本质是一个 非空唯一列 的别名。
在某些情况下 _rowid 是不存在的,其只存在于以下情况:
1)当表中存在一个 数字类型 的单列主键时, _rowid 其实就是指的是这个主键列
2)当表中 不存在主键 但存在一个 数字类型 的 非空唯一列 时, _rowid 其实就是指的是对应 非空唯一列 。
需要注意以下情况是不存在 _rowid 的
1)主键列 或者 非空唯一列 的类型不是 数字类型
2)主键 是联合主键
3)唯一 列不是非空的。
<code style="margin-left:0">delete from hwb where id in ( select id from ( select * from hwb a WHERE EXISTS (SELECT 1 FROM hwb b WHERE a.name = b.name AND a._rowid > b._rowid))c );</code>
ps:还可考虑表切换完成去重步骤。
3、实现方法二:根据name分组,查找出id最小的,然后再查找id不包含刚才查出来的
这样就查询出了所有的重复数据(除了id最小的那行)
<code style="margin-left:0">delete from hwb WHERE id NOT IN (select tt.id from (SELECT min(c.id ) as id FROM hwb c GROUP BY NAME ) tt)</code>
4、实现方法三:通过name相同,id不同的方式来判断
<code style="margin-left:0">DELETE FROM hwb a WHERE EXISTS (SELECT 1 FROM hwb b WHERE a.name = b.name AND a.id > b.id);</code>
5、实现方法四:用hash值代替id,替换删除
%%lockres%%会返回聚集索引键的hash值,
非聚集索引,%%lockres%%会返回非聚集索引键的hash值
<code style="margin-left:0">delete from hwb a WHERE EXISTS (SELECT 1 FROM hwb b WHERE a.name = b.name AND a.%%lockres%% > b.%%lockres%%);</code>
6、实现方法五:通过分析函数根据name分组生成序号,然后删除序号大于1的数据。
语法格式:row_number() over(partition by 分组列 order by 排序列 desc)
在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by、 order by 的执行。
<code style="margin-left:0">DELETE FROM hwb a WHERE id IN ( SELECT b.id FROM (SELECT id, ROW_NUMBER () OVER ( PARTITION BY name ORDER BY id ) AS seq FROM hwb) b WHERE b.seq > 1 );</code>
7、【推荐】实现方法六:根据hash值删除
<code style="margin-left:0">DELETE FROM hwb a WHERE a.%%lockres%% > (SELECT MIN(b.%%lockres%%) FROM hwb b WHERE a.name = b.name);</code>
3、实现方法二:
根据name分组,查找出id最小的,然后再查找id不包含刚才查出来的。这样就查询出了所有的重复数据(除了id最小的那行)
<code style="margin-left:0">delete from hwb WHERE id NOT IN (SELECT min(c.id ) as id FROM hwb c GROUP BY NAME );</code>
4、实现方法三:通过name相同,id不同的方式来判断
<code style="margin-left:0">delete from hwb a WHERE EXISTS (SELECT 1 FROM hwb b WHERE a.name = b.name AND a.id > b.id);</code>
5、[推荐]实现方法四:用ctid代替id,替换删除
<code style="margin-left:0">delete from hwb a WHERE EXISTS (SELECT 1 FROM hwb b WHERE a.name = b.name AND a.ctid > b.ctid); --或者如下: select * from hwb WHERE ctid NOT IN (SELECT min(ctid) as id FROM hwb GROUP BY NAME );</code>
6、[最高效推荐]实现方法五:用ctid代替id,结合row_number替换删除
<code style="margin-left:0">delete FROM hwb a WHERE a.ctid = ANY (array (SELECT ctid FROM (SELECT row_number() over(PARTITION BY NAME) as seq, ctid FROM hwb ) t WHERE t.seq > 1));</code>
本文转载至头条用户“波波说运维”
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/187117.html原文链接:https://javaforall.cn
未经允许不得转载:木盒主机 » 数据库去重有几种方法_去重数据库