当所有元组在重复项和原始元组中都相同时,如何删除重复项却保留一个?在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)