oracle学习之rownum和rowid

2023-11-11

rownum先百度一波https://www.cnblogs.com/xfeiyun/p/16355165.html

rownum是oracle特有的一个关键字。

对于基表,在insert记录时,oracle就按照insert的顺序,将rownum分配给每一行记录,因此在select一个基表的时候,rownum的排序是根据insert记录的顺序显示的。

CREATE TABLE TEST.CC_STUDENT_02 (ID VARCHAR2(256), USERNAME VARCHAR2(22))

INSERT INTO test.CC_STUDENT_02 VALUES(1,1);
INSERT INTO test.CC_STUDENT_02 VALUES(2,2);
INSERT INTO test.CC_STUDENT_02 VALUES(1,1);
INSERT INTO test.CC_STUDENT_02 VALUES(2,2);
INSERT INTO test.CC_STUDENT_02 VALUES(3,3);

注意注意注意对于子查询来说,rownum会重新生成

SELECT  id ,USERNAME ,r1 ,rownum AS r2 FROM ( 
SELECT rowid ,id,USERNAME,rownum AS r1

FROM test.CC_STUDENT_02 ORDER BY id )t

 r1还是我们最开是插入的顺序,就是oracle最初给这5条记录赋予的行数。

r2是因为我们把order by 当作了t表,oracle把这个t表当作一个新的表,再重新赋予了rownum

 如何使用rownum去分页查询或者查询指定行。

1、rownum对于等于某值的查询条件:如果想找到第一条查询数据,可以使用rownum=1作为查询条件,但是想找到第二条查询数据,使用rownum=2则查不到数据,原因是:rownum都是从1开始,但是1以上的自然数与rownum做等于时,都认为是false条件,所以无法查询到rownum=n (n>1的自然数)

SELECT id,USERNAME,rownum AS r1 FROM test.CC_STUDENT_02 
WHERE ROWNUM =1 --只能查到第一行

WHERE ROWNUM =2 --查不到任何数据 

2、rownum对于大于某值的查询条件:要是想查询出第二行以后的记录,直接使用rownum>2是查不出数据的,原因是rownum是一个总是以1开始的伪例,rownum>n (n>1的自然数)依然不成立。可以使用子查询来解决,注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。例如:

SELECT id,USERNAME,rownum AS r1  FROM test.CC_STUDENT_02  

WHERE ROWNUM >0 --查出全部数据

WHERE ROWNUM >1 --查不到任何数据

3、rownum对于小于某值的查询条件: rownum对于rownum<n((n>1的自然数)的条件认为是成立的,所以可以找到记录。

注意:对于查询rownum在某区间的数据,必须使用子查询,例如要查询rownum在第二行到第三行之间的数据,包括第二行和第三行数据,那么我们只能写以下语句,先让它返回小于等于三的记录行,然后在主查询中判断新的rownum的别名列大于等于二的记录行。但是这样的操作会在大数据集中影响速度。

SELECT  id ,USERNAME ,r1 ,rownum AS r2 FROM ( 
SELECT id,USERNAME,rownum AS r1   --注意这里要取别名

FROM test.CC_STUDENT_02   t1

WHERE ROWNUM <4
)t2
WHERE r1>1  --上面不取别名 这里写rownum是t1还是t2的呢?

4、rownum和排序 Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。

其实这里就是说你是想要insert的排序的rownum还是你自己定义的排序规则。

实战分析

 说说我遇到和rownum遇到的一个问题。

我向对方发http请求,对方从oracle数据返回500条数据,总数据大概有5w条,我每获取500条数据就落地写到hdfs,然后500一追加,一般几分钟就跑完了。突然有一天别人反馈我这边数据重复了,我就惊呆了,查询hdfs数据确实重复了。

那么此时有个问题,是我写重复了还是数据库重复了,先要别人查了下,数据库是ok的

那么我开始自己检查,突然发现比如第300-310 共10条数据和第1300-1310的10条数据是重复的。这个时候又有问题,是我程序写错了,还是对方传错了?

后来检查的时候是发现没有order by (还是order by month)就用了rownum,导致这500数据不稳定,有时候会重复。

说下原因 如果你没有order by 系统还是默认有个排序规则。或者你order by month(这个比较通用的字段 例如 sex vip) 这种排序是很容易出现问题的!!!!

当时排查就是发现他没有order by 。。 后面select* from table order by month,name,id 就好了,总之尽可能的保证排序的唯一性。当然你要是前端展示无所谓,重复就重复了,谁还记得第1页和第100页的数据是否重复。

rowid 照例先百度一波。Oracle中的rowid

ROWID是ORACLE中的一个重要的概念。用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。ROWID它是一个伪列,它并不实际存在于表中。它是ORACLE在读取表中数据行时,根据每一行数据的物理地址信息编码而成的一个伪列。所以根据一行数据的ROWID能找到一行数据的物理地址信息。从而快速地定位到数据行。数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。

说的有点多,个人理解,其实可以把rowid看作是该条数据存放的物理地址,在这张表内是唯一的(感觉是在整个数据库也是唯一的)。 也可以理解为java中每个对象在堆中地址值,地址唯一,但是你不知道地址是哪里,

Oracle中的rowid  这篇文章详细介绍了rowid的每个字母都代表啥。。

接着来说rowid有什么用?

 oracle数据库中存在两条相同的数据,怎么删除其中的一条呢 比如删除第二条id=1的数据?

 使用rownum我好像想不出来怎么删

这个时候就可以用rowid了,因为他代表的是每条数据的唯一值,可以间接性的看作是mysql的主键。

DELETE FROM test.CC_STUDENT_02 cs  WHERE rowid ='AAKIY/ACnAAAWxjAAC'

其实在这里就rowid就相当于唯一键。

那么问题来了,如果有多条重复数据怎么同时删除所有重复的数据呢? 

删除思路参考 rowid的作用 

思路就是 找到相同的id和name的最大rowid 然后not in

DELETE FROM test.CC_STUDENT_02 t1 WHERE rowid NOT IN (SELECT max(rowid) FROM test.CC_STUDENT_02 t2 WHERE t1.id=t2.id AND t1.USERNAME=t2.USERNAME )

delete from emp where rowid not in (select max(rowid) from test.CC_STUDENT_02 group by id,name)

 

差不多懂了一点基础的用法。那么我现在有个问题,rowid 代表的这条数据的唯一性,而且rowid只存在于oracle,现在我把oracle数据迁移到hive了,怎么替代rowid呢?

目前就想到一个hash(*) 和一个把所有rowid也导入到hive。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

oracle学习之rownum和rowid 的相关文章

  • Oracle中“NUMBER”和“NUMBER(*,0)”相同吗?

    在甲骨文中文档 http docs oracle com cd B28359 01 server 111 b28318 datatype htm i22289据说 数字 精度 小数位数 如果未指定精度 则该列将存储给定的值 如果 未指定比例
  • 带触发器的物化视图?

    我可以在物化视图上创建触发器吗 我用的是甲骨文10g 是的你可以 请小心 这是什么Oracle 文档 http download oracle com docs cd B19306 01 server 102 b14200 statemen
  • C# 中强制关闭 oracle 连接

    我有一个报告窗口 显示从可能长时间运行的 Oracle 存储过程返回的结果 我的问题是 当用户关闭窗口时 与 Oracle 的连接保持打开状态 并且可能长时间运行的报告不会被取消 关闭打开的连接的唯一方法是 DBA 手动终止它们或用户退出整
  • 插入期间违反唯一约束:为什么? (甲骨文)

    我正在尝试在表中创建一个新行 表上有两个约束 一个是关键字段 DB ID 另一个是将值限制为字段 ENV 中的几个之一 当我进行插入时 我没有将关键字段作为我尝试插入的字段之一 但我收到此错误 unique constraint N390
  • 从 all_tab_columns 中选择,其中表有 > 0 行

    我需要在大型数据库中搜索与列名匹配的表 但该表必须有超过 0 行 顺便说一句 这是查询 SELECT FROM all tab columns WHERE column name LIKE ID SUPPORT 您可以使用单个查询来过滤名称
  • 如何查看授予其他用户的架构哪些权限

    考虑这种情况 在数据库中 我有两个用户 A 和 B 及其相应的架构 我想知道 如何获取信息 架构 B 中的用户 A 有哪些权限 考虑这种情况 我们有两个用户及其关联的场景 我们有用户A和用户B 在A中 假设我们有TB1 TB2 在B中 假设
  • 尝试在 Oracle 11.2.0.2.0(64 位)中获取连接时出现 java.lang.ArithmeticException

    我目前正在 Oracle 中使用 Java 存储过程 并且在尝试在 Java 代码中获取连接时看到一些奇怪的行为 我的Java被打包成jar文件 然后使用以下命令部署到Oracle中loadjava命令行实用程序 Apackage然后在数据
  • Oracle 中的函数与过程

    Oracle 中函数和过程的主要区别是什么 如果我可以用函数完成所有事情 为什么我必须使用过程 如果我无法在sql语句中调用过程 好吧 我会编写一个函数来完成相同的工作 过程不返回值 好的 在任何 dml 操作后我将仅返回 sql rowc
  • Oracle ODP.net 托管驱动程序与非托管驱动程序

    托管和非托管 Oracle ODP Net 驱动程序之间是否存在任何性能基准 即 除了架构 部署简单性之外 迁移到托管驱动程序是否有任何优势 我想分享一些结果 我认为与部署的简便性相比 性能上的小缺陷是值得的 Note seg意味着秒 对于
  • 使用 SQL 序数位置表示法的好处?

    背景资料 序数位置表示法 又称序数 是基于列列表中的列顺序的列简写 SELECT子句 而不是列名或列别名 通常支持在ORDER BY子句 某些数据库 MySQL 3 23 PostgreSQL 8 0 支持语法GROUP BY条款也是如此
  • 使用Powershell访问远程Oracle数据库

    我需要能够连接到我的网络上基于 Windows 7 的 Oracle 服务器 32 位 Oracle XE 我需要连接的机器运行 Windows 7 64 位 两台机器上都安装了 Powershell 我已在 64 位计算机上安装了 Ora
  • 分层查询

    我希望我能够解释困扰我的问题 我有以下分层数据集 这只是 34K 记录的子集 PARENT ID CHILD ID EXAM TUDA12802 TUDA12982 N TUDA12982 TUDA12984 J TUDA12984 TUD
  • ORA-12154: TNS: 无法解析指定的连接标识符 (PLSQL Developer)

    我需要使用 PLSQL Developer 访问 oracle 数据库 当我尝试连接到数据库时出现以下错误 ORA 12154 TNS could not resolve the connect identifier specified 我
  • Oracle查询结果分页无TABLE FULL SCAN数据访问方式

    stackoverflow 上有很多关于如何正确执行分页的问题 对于 Oracle 来说 最流行的答案是这样的 select from select row rownum rownum from select from some table
  • 在 Oracle 行的多个列上使用透视

    我在 Oracle 表中有以下示例数据 tab1 我正在尝试将行转换为列 我知道如何在某一列上使用 Oracle 数据透视表 但是否可以将其应用于多个列 样本数据 Type weight height A 50 10 A 60 12 B 4
  • 在触发期间更新 oracle 中的同一行?

    简短的问题 因为我不知道如何搜索这个 我可以 重新更新 同一行吗 例如 我有一个存储付款小计的字段 并且考虑到我的业务限制 我可以更新该值 我可以仅用触发器更新同一行的总计吗 预先谢谢您 顺便说一句 我正在使用 Oracle 和 PL SQ
  • 在 PL/SQL 中将绑定变量与动态 SELECT INTO 子句结合使用

    我有一个关于 PL SQL 中的动态 SQL 语句中可以使用绑定变量的问题 例如 我知道这是有效的 CREATE OR REPLACE FUNCTION get num of employees p loc VARCHAR2 p job V
  • OracleDataSource.getConnection 是线程安全的吗?

    我以为找到这个答案很容易 但并不是那么容易 有谁知道 OracleDataSource getConnection 方法是否是线程安全的 我不是指它返回的 Connection 对象 而是指 getConnection 本身的调用 具体来说
  • ora-04091 表正在发生变化-

    我正在使用一个函数来比较表 1 和表 2 中的所有列并返回 Y 或 N 在此基础上 我将更新我的表 1 但是当我运行合并语句时 它显示错误 ora 04091 Table1 正在发生变化 触发器 函数可能看不到它 我怎样才能解决这个问题 C
  • 快速查询最新记录的方法?

    我有一张这样的表 USER PLAN START DATE END DATE 1 A 20110101 NULL 1 B 20100101 20101231 2 A 20100101 20100505 在某种程度上 如果END DATE i

随机推荐

  • React Native_手把手教你做项目(四.上拉加载更多)

    在手机应用上 上拉加载更多的功能是必不可少的 同时 在实际使用的时候 当下拉加载 数据仍未返回时 用户多次重复进行下拉加载的操作 为了不产生额外的垃圾数据 我们需要进行判断 同时为了更好的用户体验 增加数据缓存功能 list js文件 Sa
  • 1096C - Polygon for the Angle-几何-性质

    思路 根 据 几 何 性 质 正 多 边 形 所 有 三 个 点组成的 角 都 是最小角的倍数 然后根据内角公式 可以求出 正多边形 最小角为 多边形内角 n 2 然后 打表发现 180边形最小角为1 最大角 178 所以 只有 179无法
  • 阿里巴巴Java开发规约插件p3c详细教程及使用感受

    作者 13 GitHub https github com ZHENFENG13 版权声明 本文为原创文章 未经允许不得转载 阿里巴巴Java开发手册 在进入正题介绍这款插件之前 首先来谈一下 阿里巴巴Java开发手册 2017年年初 首次
  • R和Python概率分布统计和Python验证独立性和平稳性时间序列

    R概率分布和统计 R 基础知识 汇总统计数据 图形显示 概率基础知识 概率规则 条件概率 后验概率和贝叶斯 可靠性 离散分布介绍 几何分布 概率密度函数 概率密度函数 pdf 定义为 P X x
  • Qt教程7--一个事件触发另一个

    Qt教程一 第七章 一个事物领导另一个 原文 QT3 1的帮助文档翻译 zieckey zieckey yahoo com cn 修改 zieckey zieckey yahoo com cn 这个例子显示了如何使用信号和槽来创建自定义窗口
  • 【RDMA】最全RDMA学习教程(建议收藏)

    目录 RDMA技术分享 RDMA技术分享 RDMA技术详解 RDMA编程 RDMA 网络 ROCE iWarp 性能优化 配置和特性优化 Qos流控 命令和测试 文档和相关资料 作者 bandaoyu 随时更新 源文连接 https blo
  • 图片上传的ajax代码,一个伪ajax图片上传代码实现示例

    if FILES gt window parent ajaxUploadPicture uploadCallback http img0 bdstatic com img image 5099213b07eca8065380ce7f75e9
  • tensorflow官方教程:运用模型对类别进行预测

    tensorflow官方教程 运用模型对类别进行预测 本文主要包含如下内容 tensorflow官方教程运用模型对类别进行预测 python版本 C代码 本教程将会教你如何使用Inception v3 你将学会如何用Python或者C 把图
  • ubuntu 安装Fastdfs

    安装fastdfs依赖插件libfastcommon 下载 https github com happyfish100 libfastcommon archive V1 0 39 tar gz 创建 usr local software 目
  • 蓝桥杯 BEGIN-2 long long int的使用

    include
  • 机房环境监控系统的作用,环境与设备监控系统的作用

    通信机房环境监控系统 以下简称动环监控系统 是指电源柜 UPS 监控 远程通信 远程调试 远程控制 即时监控其运行参数 故障检测和处理 记录和分析的有关数据 对其设备 空调 电池等工业设备以及门磁 红外 渗水 温湿度 烟度等环境参数进行统一
  • 别只盯着“四小龙”,CV的市场格局正在悄悄改变

    大数据产业创新服务媒体 聚焦数据 改变商业 在计算机视觉领域 比较知名的是商汤 旷视 云从 依图这 四小龙 他们不仅知名度更高 收入水平和估值也更高 从最新的财报来看 这四小龙都不同程度陷入了困境 收入增长乏力 巨额亏损看不到扭转的态势 四
  • crc16 ccitt的详细标准及其出处

    CRC16 CCITT是一个16位的循环冗余校验 CRC 算法 它是由国际电报电话咨询委员会 CCITT 制定的 该算法被广泛用于通信领域 以验证数据传输的完整性 以下是CRC16 CCITT算法的详细标准 多项式生成器 Polynomia
  • weblogic wls-wsat组件远程命令执行(CVE-2017-3506)

    所有文章 仅供安全研究与学习之用 后果自负 weblogic wls wsat组件远程命令执行 CVE 2017 3506 前言 与weblogic 反序列化 CVE 2017 10271 类似 一般情况下weblogic会开放7001以及
  • (port is already in use)端口被占用问题

    前言 端口占用问题几乎每个开发人员都会遇到 每次用每次查 下面来记录下解决过程 以便日后需要 正文 1 调出命令窗口 windows R 组合键 调出命令窗口 2 查找占用端口对应的PID 进程号 说明 以下举例用到的端口和进程等仅做参考
  • Cadence Allegro PCB快捷键设置

    1 通过env文件设置快捷键 在安装路径下D Cadence SPB 16 6 share pcb text中找到env文件 利用记事本打开 就可以加入自己的快捷键方式了 二 env文件在哪里 以我的电脑为例 在安装路径下D cadence
  • 实现点击图片放大查看功能

    1 html 代码 div style display none text align center width 100 height 100 background color none img style height 1 width 4
  • unity物体自身轴旋转_unity3d如何实现物体自动旋转-unity3d物体自动旋转的设置教程 - 河东软件园...

    unity3d是我们设计师用来制作游戏画面的软件 很多的手机App也可以使用它来制作 有的时候我们在游戏中能够看见一些人物或是物体的移动效果 例如平移 旋转等等都可以轻松的利用这款软件来实现 今天小编想和大家分享一下如何在unity3d中使
  • 2020-08-13

    https www cnblogs com daizhengyang p 13384169 html https blog csdn net qq 27289001 article details 77150598 https www cn
  • oracle学习之rownum和rowid

    rownum先百度一波https www cnblogs com xfeiyun p 16355165 html rownum是oracle特有的一个关键字 对于基表 在insert记录时 oracle就按照insert的顺序 将rownu