oracle学习之rownum和rowid

news2024/9/25 23:25:09

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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java基础(八)异常处理

1. 异常概述 1.1 什么是生活的异常 男主角小明每天开车上班&#xff0c;正常车程1小时。但是&#xff0c;不出意外的话&#xff0c;可能会出现意外。 出现意外&#xff0c;即为异常情况。我们会做相应的处理。如果不处理&#xff0c;到不了公司。处理完了&#xff0c;就可以…

Ubuntu下打开QtCreator,环境变量(PATH、LD_LIBRARY_PATH等)与预期不一致的问题

现象展示 在Ubuntu中&#xff0c;安装好Qt之后&#xff0c;可以在系统桌面的左下角找到启动图标 但是&#xff0c;这种方式启动的QtCreator所读取到的环境变量和我们从命令行读取到的不一致&#xff1a; 可以看到&#xff0c;明显少了这个&#xff1a;/opt/ros/humble/bin 因…

Docker实战笔记3-仓库

转载请标明出处&#xff1a;http://blog.csdn.net/zhaoyanjun6/article/details/130260521 本文出自【赵彦军的博客】 文章目录 官方仓库 Docker Hub注册登录查看镜像搜索镜像推送镜像自动构建 网易镜像 官方仓库 Docker Hub https://hub.docker.com/ 目前 Docker 官方维护了…

C++入门之auto关键字内联函数

文章目录 前言一、auto关键字1.auto简介2.auto的使用细则&#xff08;1&#xff09;auto与指针和引用结合起来使用&#xff08;2&#xff09;在同一行定义多个变量&#xff08;3&#xff09;auto不能推导的场景 3.基于范围的for循环(C11)&#xff08;1&#xff09;遍历&#xf…

聚观早报|五一首日高铁跨省游热度暴涨;大语言模型规模接近极限

今日要闻&#xff1a;马斯克已创立新人工智能公司X.AI&#xff1b;五一假期首日高铁跨省游热度暴涨&#xff1b;大语言模型规模已接近极限&#xff1b;贾跃亭发文谈FF首台量产车下线&#xff1b;斑马智行与智己汽车进一步合作 马斯克已创立新人工智能公司X.AI 据外媒报道&…

Node 07-nvm

nvm 介绍 nvm 全称 Node Version Manager 顾名思义它是用来管理 node 版本的工具&#xff0c;方便切换不同版本的Node.js 使用 nvm 的使用非常的简单&#xff0c;跟 npm 的使用方法类似 下载安装 首先先下载 nvm&#xff0c;下载地址 https://github.com/coreybutler/nvm-…

【Python中线程和进程详解】

一.区别 几乎所有的操作系统都支持同时运行多个任务&#xff0c;每个任务通常是一个程序&#xff0c;每一个运行中的程序就是一个进程&#xff0c;即进程是应用程序的执行实例。现代的操作系统几乎都支持多进程并发执行。 注意&#xff0c;并发和并行是两个概念&#xff0c;并…

好家伙,9:00面试,9:06就出来了,问的实在是太...

从外包出来&#xff0c;没想到死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到2月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内推我去…

会声会影老牌视频剪辑软件2023新版本升级

会声会影2023(VideoStudio)是一款功能强大的专业视频制作软件的视频编辑软件及视频剪辑软件&#xff0c;可以剪辑&合并视频、制作视频、屏幕录制、光盘制作、视频后期编辑、添加特效、字幕和配音等操作&#xff0c;任何人都能快速上手&#xff0c;以它的界面美观&#xff0…

#关于webpack版本号的问题#

场景&#xff1a;在使用npm install 安装package.json里面的依赖的&#xff0c;打包&#xff0c;运行的使用&#xff0c;有时候会失败。 原因 &#xff1a;由于webpack webpack-cli版本不同导致的 这个时候需要解决webpack webpack-cli的安装&#xff0c;切换等操作 例如使用…

python+vue 智慧校园校医室问诊系统

本网站所实现的是一个智慧校园校医室问诊系统&#xff0c;该系统严格按照需求分析制作相关模块&#xff0c;并利用所学知识尽力完成&#xff0c;但是本人由于学识浅薄&#xff0c;无法真正做到让该程序可以投入市场使用&#xff0c;仅仅简单实现部分功能&#xff0c;希望日后还…

CentOS8使用cephadm部署和配置Ceph Octopus

部署工具&#xff1a;cephadm操作系统&#xff1a;CentOS 8Ceph版本&#xff1a;Octopus操作用户&#xff1a;root 部署前&#xff0c;请注意&#xff1a;根据目前&#xff08;2020年8月&#xff09;Ceph官方文档的介绍&#xff0c;cephadm的对各服务的支持情况如下&#xff1a…

3D WEB端渲染引擎如何使用服务器端的转换程序?1个案例教会你

前言 HOOPS SDK是用于3D工业软件开发的工具包&#xff0c;其中包括4款工具&#xff0c;分别是用于读取和写入30多种CAD文件格式的HOOPS Exchange、专注于Web端工程图形渲染的HOOPS Communicator、用于移动端和PC端工程图形渲染的HOOPS Visualize、支持将3D数据以原生3D PDF、H…

html+css+js本地音乐播放器,实现可视化音频频谱

效果 htmlcssjs本地音乐播放器&#xff0c;实现可视化音频频谱 前言 之前用swing写了个本地音乐播放器&#xff08;如下图&#xff09;&#xff0c;但是效果一言难尽&#xff0c;界面丑&#xff0c;功能bug也多&#xff0c;唉 所以后面又重新用html写了个&#xff0c;界面样式…

港联证券:为什么会出现股票跌停?股票跌停应该怎么卖出?

股票跌停的意思是股票跌落到交易规则设定的涨跌幅限制范围外&#xff0c;致使股票无法正常卖出的现象。那么为什么会呈现股票跌停&#xff1f;股票跌停应该怎样卖出&#xff1f;下面就由港联证券为大家分析&#xff1a; 为什么会呈现股票跌停&#xff1f; 1、主力出货 当某只…

【竞赛知识ONE】取余问题

前言: 在一些竞赛题中,往往要求对最终的数据结果进行取余或者求模运算。但是如果仅仅只是在输出最终结果的时候对某个数取模,那么可能会导致数据溢出等问题,所以在计算过程中也需要对中间数据进行取模操作。 定理: 举例: 1. 案例一 解题分析:思路并不难理解计算…

TryHackMe-Fusion Corp(ez Windows域渗透)

Fusion Corp 你不久前与Fusion Corp联系。他们联系了你&#xff0c;说他们已经修补了所有报告的内容&#xff0c;你可以开始重新测试了。 端口扫描 循例nmap 将fusion.corp域名加入hosts Web枚举 gobuster扫 访问backup 下载该文件&#xff0c;打开发现是一些用户名 保存下来…

大模型的三大法宝:Finetune, Prompt Engineering, Reward

编者按&#xff1a;基于基础通用模型构建领域或企业特有模型是目前趋势。本文简明介绍了最大化挖掘语言模型潜力的三大法宝——Finetune, Prompt Engineering和RLHF——的基本概念&#xff0c;并指出了大模型微调面临的工具层面的挑战。 以下是译文&#xff0c;Enjoy! 作者 | B…

MySQL索引原理及实战

MySQL索引原理及实战 一、一条Select语句二、索引介绍1、索引是什么2、索引的优势和劣势优势&#xff1a;劣势&#xff1a; 三、索引的使用1、索引的类型普通索引&#xff1a;唯一索引&#xff1a;全文索引&#xff1a;空间索引&#xff1a;前缀索引 &#xff1a;按照索引列的数…

dolt:自带版本管理的数据库

在做数据分析或算法优化时&#xff0c;有一个需求是比较常见的&#xff1a;在调整了一些代码后&#xff0c;产生了新的结果数据&#xff0c;需要将这些数据以及产生它们的代码存储下来以便事后进行分析。解决这个问题的核心就在于如何对代码和结果数据进行版本管理&#xff0c;…