首页 > 数据库 >Oracle中ROWNUM伪列的使用

Oracle中ROWNUM伪列的使用

时间:2024-03-05 11:00:52浏览次数:25  
标签:name 伪列 查询 Oracle ROWNUM rownum select

1.问题

ROWNUM作为Oracle提供的一种伪列,有着其特殊性,必须谨慎使用,不然就很可能引发错误!
注意:ROWNUM 是一个伪列,在查询的结果中动态分配行号!!!也就是会所在查询过程无法直接诶使用ROWNUM,一般使用子查询作为过渡

参考: Oracle中rownum的基本用法

2.错误

2.1 错误:ORA-00904: "RM": 标识符无效

SELECT ROWNUM AS rm, t1.*
FROM (
	SELECT prod_name, prod_price 
	FROM PRODUCTS
	ORDER BY PROD_PRICE DESC
) t1
WHERE rm <= 6;

ROWNUM 是一个伪列,在查询的结果中动态分配行号.
查询出结果了才会分配行号,where筛选条件还在查询过程中,自然不能在此便使用,需要使用子查询的方式
注意这里如果用 WHERE ROWNUM <= 6; 是成立的,但是用的不是最外层的ROWNUM(别名rm)而是内层查询结果得到的ROWNUM

2.2 ORA-00907: 缺失右括号

这里就是直接使用ROWNUM的错误典型,我这里默认在得出结果前就可以获得ROWNUM,但是这里这里就直接报错

SELECT *
FROM (
	SELECT prod_name, prod_price 
	FROM PRODUCTS
	ORDER BY PROD_PRICE DESC
	WHERE ROWNUM <=6
	)
WHERE rm > 4;

这里只要再加一个子查询即可,可见第一个ROWNUM是最里层查询出结果的伪列,第二个ROWNUM别名rm是次外层查询出结果的得到的伪列

SELECT *
FROM (
	SELECT ROWNUM AS rm, t1.*
	FROM(
		SELECT prod_name, prod_price 
		FROM PRODUCTS
		ORDER BY PROD_PRICE DESC
	)t1
	WHERE ROWNUM <=6
	)
WHERE rm > 4;

2.3 常见注意事项

对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。

(1) rownum 对于等于某值的查询条件

如果希望找到学生表中第一学生的信息,可以使用rownum=1作为件。
但是想找到学生表中第二学生的信息,使用rownum=2结果查不到数据。
因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。

SQL> select rownum,id,name from student where rownum = 1;(可以用在限制返回记录**条**数的地方,保证不出错,如:隐式游标) 
SQL> select rownum,id,name from student where rownum = 2; 
ROWNUM ID NAME 
---------- ------ ---------------------------------------------------

(2)rownum对于大于某值的查询条件

如果想找到从第二行记录以后的记录,当使用 rownum > 2 是查不出记录的,
原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种件依旧不成立,所以查不到记录。 查找到第二行以后的记录可使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列

SQL>select * from(select rownum no ,id,name from student) where no>2; 
NO ID NAME
 ---------- ------ --------------------------------------------------- 
3 200003 李三 
4 200004 赵四

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

SQL> select rownum,id,name from student where rownum <3; 
ROWNUM ID NAME 
---------- ------ --------------------------------------------------- 
1 200001 张一 
2 200002 王二

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

SQL> select * from (select **rownum no**,id,name from student where rownum<=3 ) where no >=2; 
NO ID NAME 
---------- ------ --------------------------------------------------- 
2 200002 王二 
3 200003 李三

(4)rownum和排序

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

SQL> select rownum ,id,name from student order by name; 
ROWNUM ID NAME 
---------- ------ --------------------------------------------------- 
3 200003 李三 
2 200002 王二 
1 200001 张一 
4 200004 赵四 

可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。
为了解决这个问题,**必须使用子查询;

SQL> select rownum ,id,name from (select * from student order by name); 
ROWNUM ID NAME 
---------- ------ --------------------------------------------------- 
1 200003 李三 
2 200002 王二 
3 200001 张一 
4 200004 赵四 

这样就成了按name排序,并且用rownum标出正确序号(有小到大)

标签:name,伪列,查询,Oracle,ROWNUM,rownum,select
From: https://www.cnblogs.com/trmbh12/p/18053403

相关文章

  • Oracle中不允许表的列名称使用Oracle声明的关键字! (ORA-01747: user.table.column, t
    1.问题ORA-01747:user.table.column,table.column或列说明无效--Oracle下,根据商品价格从高到低取4-6名商品SELECT*FROM( SELECTROWNUM,t1.* FROM( SELECTprod_name,prod_price FROMPRODUCTS ORDERBYPROD_PRICEDESC )t1 WHEREROWNUM<=6......
  • Oracle拼接字段时,含字符类型拼接会多出空格?
    1.问题如下图所示,当我们在Oracle中使用||拼接字段时,若含字符char类型,会多出一些奇怪的空格,原因和如何解决呢?SELECTVEND_NAME||'('||VEND_COUNTRY||')'FROMVENDORSORDERBYVEND_NAME;2.解决出现这种情况的主要是因为变量的类型为char,因为char类型为固定长度......
  • Oracle数据库错误:ora-28014:cannot drop administrative users(无法删除管理用户或角色
    1.问题在创建用户test之后,删除时发生错误ora-28014:cannotdropadministrativeusers2.解决由于Oracle数据库要求创建用户必须以C##开头,在创建该用户时,我们设置了altersessionset"_oracle_script"=true;Oracle数据库如何解决创建用户名开头必须要C##问题?但是删除时,由......
  • 记一次在oracle数据库中添加全文索引的过程
    前景:在创建全文索引之前,有如下几个内容需要确认下:1.全文索引不支持nvarchar2类型,所以需要创建全文索引的字段的字段类型,如果是这个类型,可以修改为varchar2();2.如果需要创建全文索引的字段包含(1、中文、英文结合,或者纯英文;2、中文、数字结合,或者纯数字的)这几种情况的,需要对......
  • Oracle 表空间和数据文件遇到的坑 (转载于 微信公众号 JieKeXu DBA之路)
    转载链接https://mp.weixin.qq.com/s/IKF_KrWkxZ5BJS-OacYWUw前言本文适用于普通的标准的8k块大小的Oracle企业版数据库,10g、11g、19c均可适用,但对于ODA,一体机可能有所区别,请慎重使用1.db_files的坑记录一下年前遇到的一个关于表空间扩容的小问题,大家都知道对于Oracle......
  • Oracle21C安装
    一、环境准备客户端工具:MobaXterm(如果使用可视化界面安装,需要使用此客户端,xshell可视化工具需要收费)服务器:centos7.9  CentOS-7-x86_64-DVD-2009.iso4核心CPU8G内存数据库:Oracle21C  LINUX.X64_213000_db_home.zipyum源:阿里云镜像站:https://developer.aliyun.com/m......
  • Oracle---windows下安装oracle19c
    Oracle---windows下安装oracle19c</div><divclass="postText"><divid="cnblogs_post_body"class="blogpost-bodyblogpost-body-html"> 目录:一.官网下载oracle19c以及客户端二.安装oracle19c三.配置1.配置服务2.配置......
  • Oracle 12C数据库从文件系统迁移到ASM
     查看参数文件位置SQL>showparameterspfileNAMETYPEVALUE-----------------------------------------------------------------------------spfilestring/u01/app/oracle/product/12.......
  • Oracle一次更新(UpData)多列通过Select获取到的值
    第一种MERGEINTO方法MERGEINTOSAFERUNWMS.WCSSTOCKLOCWSLUSING(SELECTWSP.LOCNO,WSP.MATERCODE,WSP.PALLETNO,WSP.BATNOFROMSAFERUNWMS.WCSSTOCKPORTWSPWHEREWSP.LOCNO=N_S......
  • oracle表空间不足报错排查及扩容
    一、报错代码:Errorupdatingdatabase. Cause:java.sql.SQLException:ORA-01691:unabletoextendlobsegmentOMSP_FLOWGINE.SYS_LOB0000035445C00014$$by1024intablespaceOMSP 二、排查执行下面sql:SELECTa.tablespace_name,TRUNC(tablespace_size......