微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当所有元组在重复项和原始元组中都相同时,如何删除重复项却保留一个?在PostgreSQL中

如何解决当所有元组在重复项和原始元组中都相同时,如何删除重复项却保留一个?在PostgreSQL中

假设我们有下表。
如何删除2个重复项并保留一个?我的代码删除了所有这些代码

+----+-------+
| ID | NAME  |
+----+-------+
|  2 | ARK   |
|  3 | CAR   |
|  9 | PAR   |
|  9 | PAR   |
|  9 | PAR   |
+----+-------+

解决方法

理想情况下,您的表应具有唯一的ID。如果没有,则可以使用ctid作为虚拟唯一ID字段,如下所示。

ctid表示行版本在其表中的物理位置。请注意,尽管可以使用ctid快速定位行版本,但是如果通过VACUUM FULL更新或移动了该行的ctid,则该ctid将会更改。因此,ctid不能用作长期行标识符。但这在这里起到了作用。

 delete from my_table a using my_table b where a=b and a.ctid < b.ctid;

DB小提琴链接-https://dbfiddle.uk/?rdbms=postgres_10&fiddle=4888d519e125dc095496a57477a60b9f

,

您可以使用deletion by row_number

    Delete from table t1 where 1<(
   Select rn from ( select id,name,row_number() over (partition by id,name
  order by id) rn from table) 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。