问题描述
假设我们有下表。
如何删除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)