oracle 查询不同编号的时间最小记录_投稿 | ORACLE amp; PostgreSql 利用伪列删除完全重复的两行...
作者:缪晓丽
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 利用伪列删除完全重复的两行...相关推荐
- oracle查询三个月前的时间
错误写法 -- 错误写法 select sysdate - interval '3' month from dual; 之前从网上找的,当时也认为没有什么不妥的地方,三个月前的时间不正是当前时间再减去 ...
- oracle查询删除时间戳,Oracle查询时间戳,建表时间,新建序列,误删数据
Oracle的时间戳格式查询如下: SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT'. ...
- oracle查询某个用户下所有表记录总数
1.查询库中的表名和表中记录数: SELECT T.TABLE_NAME, T.NUM_ROWS FROM USER_TABLES T; 2.查询库中记录总数: SELECT SUM(A.NUM_RO ...
- oracle 查询字符代码dump,字符集问题(Linux、oracle、终端等,导入导出数据)
locale的设定及其LANG.LC_ALL.LANGUAGE环境变量的区别 例如zh_CN.GB2312.zh_CN.GB18030或者zh_CN.UTF-8.很多人都不明白这些古里古怪的表达方式. ...
- oracle 如何边看表中字段信息_【Oracle移行到Sqlserver完美解决案】④sqluldr2+bulk 32H=3H...
在[Oracle移行到Sqlserver完美解决案]③执行时间改善案bcp+bulk 一文中,移行实现了,但数据600多万件,占内存3G多的操作log表,移行需要32H,这个时间我们是无法接受的. 原 ...
- Oracle查询数据库中所有表的记录数
方法一: 首先建立一个计算函数 >>>>>>>>>>>>>>>>>>>>> ...
- oracle 月底,Oracle查询月初和月底时间
什么时候需要用到这2个时间,先简单说下: 假如你3月15日订购的包月产品,月底出帐,那么应该收取17天的费用,这个时候就应该判断订购时间是否大于月初时间. 如果你只用到了3月25号,那么应该收取11天 ...
- oracle判断日期为月末,ORACLE查询月初和月底时间
什么时候需要用到这2个时间,先简单说下: 假如你3月15日订购的包月产品,月底出帐,那么应该收取17天的费用,这个时候就应该判断订购时间是否大于月初时间. 如果你只用到了3月25号,那么应该收取11天 ...
- oracle查询指定行数间的记录
select results.* from ( select t.* , rownum rownumber from table t order by t.id ) results w ...
最新文章
- Python零碎知识(8):模块的学习|资源利用
- php视频上传教程,php上传视频的代码_PHP教程
- Android开发之将AndroidX项目改为非androidX(android.v7.support)的方法
- Magento安装后无法访问
- 干货!无需任何工具,实测macOS双开微信客户端
- matlab 变量和数组中,求助:如何将带有符号变量的运算结果储存到数组中
- float最大_Hard 级:二叉树中的最大路径和
- 计算机组成原理—读写周期与半导体只读存储器
- idea修改项目编码
- 一个非常好用的代理服务器软件AllegroSurf
- 金融直播三大常用场景一文解析
- vim编辑器 解决vim编辑异常
- php 读取微信对账单,扣丁学堂PHP培训简述PHP如何实现微信对账单处理
- 未来IT行业前景如何?
- 1.9无穷小新生五十年
- 视频教程-计算机二级(VB)-计算机等级考试
- Android9 点击按键KeyEvent.KEYCODE_CAMERA没反应
- 英语听力采用计算机化考试,北京英语听说考试2021年 北京英语听说机考满分
- [摘录]第3章 终局谈判策略
- plot3D | 三维数据绘图(3):mesh函数、surf3D函数、spheresurf3D函数
热门文章
- sudo su su_Spring Security应用程序中的su和sudo
- Elasticsearch –使用模式替换过滤器和自定义分析器忽略查询中的特殊字符
- 将速度加快到自己的个人代码生成器中
- CompressedOops:Java压缩参考简介
- 使用Apache Storm和Kite SDK Morphlines的可配置ETL处理
- java高性能序列化_Java最佳实践–高性能序列化
- IDC关于使用JBoss Fuse的商业价值的报告(与Apache Camel一起使用)
- 嗨,您好 。 。 ! 您如何评价Java / Java EE技能?
- JDBC布尔兼容性列表
- 哪个内存更快?Heap或ByteBuffer或Direct?