作者:缪晓丽

DBA、数据库爱好者、从业10年。对 DB2、PostgreSQL、Oracle 均有较长的运维经验。

本次演示的 test 表如下:

01

Oracle 的 rowid

SQL 语句:

DELETE FROM (    SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY id) AS rn, id, name    FROM test)WHERE t.rn = 2

结果:删除不成功。

原因:delete from 后的子查询就是视图,视图是不支持 DML 操作的。

此时 rowid 派上用场,rowid 是一个伪列,并不实际存储在表中,也不占用物理数据文件,它只是标记表中每条数据的物理位置。

格式如下:

第一部分 6 位表示:该行数据所在的数据对象的 data_object_id;

第二部分 3 位表示:该行数据所在的相对数据文件的 id;

第三部分 6 位表示:该数据行所在的数据块的编号;

第四部分 3 位表示:该行数据的行的编号;

可通过 dbms_rowid 系列函数查看 ROWID 的相关信息。

用 ROWID 代替 ID 排序。

SQL 语句:

DELETE FROM testWHERE rowid = (        SELECT ROWID        FROM (            SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY rowid) AS RN, ID            FROM TEST        )        WHERE RN = 1    );

结果:删除成功。

02

PostgreSQL 的 CTID

PostgreSQL 并没用 ROWID 伪列,但是有 ctid。

ctid 的结构较 rowid 简单,如下:

格式:(Data block, Row);

Data block: 记录所在的数据块编号;

Row: 记录的行编号。

其中 0 代表第 0 块,1 和 2 代表第 1 行和第 2 行。

删除思路相同,且 PostgreSQL 支持窗口函数。

SQL 语句

DELETE FROM testWHERE ctid = (        SELECT ctid        FROM (            SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ctid) AS rn, id, ctid            FROM TEST        )        WHERE rn = 1    );

但是删除时报错了:

子查询需要加别名。

DELETE FROM testWHERE ctid = (        SELECT t.ctid        FROM (            SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ctid) AS rn, id, ctid            FROM TEST        ) t        WHERE t.rn = 1    );

结果:删除成功。

长期征稿·

恩墨学院公众号开启长期征稿,只要你有好的技术相关文章,欢迎投稿到:

edu_mkt@enmotech.com

有机会获得恩墨学院周边奖励、恩墨学院精品课程以及培训优惠卷。

oracle 查询不同编号的时间最小记录_投稿 | ORACLE amp; PostgreSql 利用伪列删除完全重复的两行...相关推荐

  1. oracle查询三个月前的时间

    错误写法 -- 错误写法 select sysdate - interval '3' month from dual; 之前从网上找的,当时也认为没有什么不妥的地方,三个月前的时间不正是当前时间再减去 ...

  2. oracle查询删除时间戳,Oracle查询时间戳,建表时间,新建序列,误删数据

    Oracle的时间戳格式查询如下: SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT'. ...

  3. oracle查询某个用户下所有表记录总数

    1.查询库中的表名和表中记录数: SELECT T.TABLE_NAME, T.NUM_ROWS FROM USER_TABLES T; 2.查询库中记录总数: SELECT SUM(A.NUM_RO ...

  4. oracle 查询字符代码dump,字符集问题(Linux、oracle、终端等,导入导出数据)

    locale的设定及其LANG.LC_ALL.LANGUAGE环境变量的区别 例如zh_CN.GB2312.zh_CN.GB18030或者zh_CN.UTF-8.很多人都不明白这些古里古怪的表达方式. ...

  5. oracle 如何边看表中字段信息_【Oracle移行到Sqlserver完美解决案】④sqluldr2+bulk 32H=3H...

    在[Oracle移行到Sqlserver完美解决案]③执行时间改善案bcp+bulk 一文中,移行实现了,但数据600多万件,占内存3G多的操作log表,移行需要32H,这个时间我们是无法接受的. 原 ...

  6. Oracle查询数据库中所有表的记录数

    方法一: 首先建立一个计算函数 >>>>>>>>>>>>>>>>>>>>> ...

  7. oracle 月底,Oracle查询月初和月底时间

    什么时候需要用到这2个时间,先简单说下: 假如你3月15日订购的包月产品,月底出帐,那么应该收取17天的费用,这个时候就应该判断订购时间是否大于月初时间. 如果你只用到了3月25号,那么应该收取11天 ...

  8. oracle判断日期为月末,ORACLE查询月初和月底时间

    什么时候需要用到这2个时间,先简单说下: 假如你3月15日订购的包月产品,月底出帐,那么应该收取17天的费用,这个时候就应该判断订购时间是否大于月初时间. 如果你只用到了3月25号,那么应该收取11天 ...

  9. oracle查询指定行数间的记录

    select results.* from (    select t.* , rownum rownumber from      table t order by t.id ) results w ...

最新文章

  1. Python零碎知识(8):模块的学习|资源利用
  2. php视频上传教程,php上传视频的代码_PHP教程
  3. Android开发之将AndroidX项目改为非androidX(android.v7.support)的方法
  4. Magento安装后无法访问
  5. 干货!无需任何工具,实测macOS双开微信客户端
  6. matlab 变量和数组中,求助:如何将带有符号变量的运算结果储存到数组中
  7. float最大_Hard 级:二叉树中的最大路径和
  8. 计算机组成原理—读写周期与半导体只读存储器
  9. idea修改项目编码
  10. 一个非常好用的代理服务器软件AllegroSurf
  11. 金融直播三大常用场景一文解析
  12. vim编辑器 解决vim编辑异常
  13. php 读取微信对账单,扣丁学堂PHP培训简述PHP如何实现微信对账单处理
  14. 未来IT行业前景如何?
  15. 1.9无穷小新生五十年
  16. 视频教程-计算机二级(VB)-计算机等级考试
  17. Android9 点击按键KeyEvent.KEYCODE_CAMERA没反应
  18. 英语听力采用计算机化考试,北京英语听说考试2021年 北京英语听说机考满分
  19. [摘录]第3章 终局谈判策略
  20. plot3D | 三维数据绘图(3):mesh函数、surf3D函数、spheresurf3D函数

热门文章

  1. sudo su su_Spring Security应用程序中的su和sudo
  2. Elasticsearch –使用模式替换过滤器和自定义分析器忽略查询中的特殊字符
  3. 将速度加快到自己的个人代码生成器中
  4. CompressedOops:Java压缩参考简介
  5. 使用Apache Storm和Kite SDK Morphlines的可配置ETL处理
  6. java高性能序列化_Java最佳实践–高性能序列化
  7. IDC关于使用JBoss Fuse的商业价值的报告(与Apache Camel一起使用)
  8. 嗨,您好 。 。 ! 您如何评价Java / Java EE技能?
  9. JDBC布尔兼容性列表
  10. 哪个内存更快?Heap或ByteBuffer或Direct?