网站微信建设,为什么选择当网站设计人员,商标购买在哪个平台好,网站建设入什么科目PostgreSQL删除重复数据同时保留每组中的一条记录
在 PostgreSQL 中#xff0c;你不能直接从一个 CTE#xff08;公共表表达式#xff09;中删除数据#xff0c;因为 CTE 只是一个临时的结果集#xff0c;它并不直接对应一个可以更新的表。但是#xff0c;你可以使用 CT…PostgreSQL删除重复数据同时保留每组中的一条记录
在 PostgreSQL 中你不能直接从一个 CTE公共表表达式中删除数据因为 CTE 只是一个临时的结果集它并不直接对应一个可以更新的表。但是你可以使用 CTE 来帮助识别哪些行需要被删除然后在主查询中删除这些行。
示例
以下是一个正确的方法来删除重复的行同时保留每组中的一条记录
比如我有一张表my_table_name里面有字段province和字段gnb_id我想根据字段province和字段gnb_id分组删除多余重复数据并保留一条
DELETE FROM my_table_name
WHERE ctid IN (SELECT ctidFROM (SELECTctid,ROW_NUMBER() OVER (PARTITION BY province, gnb_id ORDER BY gnb_id) AS rnFROMmy_table_name) subWHERE rn 1
);在这个查询中我使用了 ctid 系统列它是一个隐藏的列用于标识表中的每一行。ctid 可以被用来引用表中的特定行并允许你在外部查询中删除它们。
子查询 sub 计算了每一组的行号然后外部查询删除了所有行号大于 1 的行。注意ctid 的使用依赖于 PostgreSQL 的内部实现并且可能在某些情况下如 VACUUM 操作后发生变化。但是在大多数情况下使用 ctid 来删除行是安全且有效的。
如果你不希望或不能使用 ctid你可以添加一个唯一的标识符列比如 id并在 DELETE 语句中使用这个列来识别要删除的行。但是这需要你的表已经有一个这样的列。