加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSql中使用ctid去重

发布时间:2020-12-13 17:18:51 所属栏目:百科 来源:网络整理
导读:最近的开发中使用PostgreSql时也遇到了去重的问题,开始的时候确实一筹莫展,不像Oracle有rowid这样的字段(是因为我不知道pg中也有类似的字段),因此就在文档中找类似的字段,于是想起了几个系统字段来,这边着重就看解决问题的ctid。 ctid是一个表中物理上

最近的开发中使用PostgreSql时也遇到了去重的问题,开始的时候确实一筹莫展,不像Oracle有rowid这样的字段(是因为我不知道pg中也有类似的字段),因此就在文档中找类似的字段,于是想起了几个系统字段来,这边着重就看解决问题的ctid。

ctid是一个表中物理上确认版本的字段,这是个系统字段,只要表中存在数据那么就会存在这个字段,与oid不同。要想使用OID,创建表时应该带上with oid。

在一个表中ctid是唯一的,那么就符合了去重的先决条件。于是,在下面的情况下,

"ctid" "id" "name_1" "name_2" "name_3"
"(0,133)" "3" "name_13" "name_23" "name4444"
"(1,119)" "3" "name_13" "name_23" "name4444"

很明显两条数据一样,只需要保留一条。那么就得这样做,

select * from mytest6 where ctid in (
select min(ctid) from mytest6 where id = 3);

当然这是知道只有id=3时会出现这样的情况,假如不止这一条,那么就得这么做,

select * from mytest where ctid in (
select min(ctid) from mytest group by id);

写法可以很多,也可以不用in,而使用表关联。但是大致的解决思路就是这样。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读