暂无图片
暂无图片
1
暂无图片
暂无图片
1
暂无图片

Halo数据库ROWNUM功能详解

贾桂军 2024-01-21
12617

      对于Oracle rownum特性解释,它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推;这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。rownum伪列是Oracle数据库中最重要的功能模块之一,因此Halo数据库在Oracle模式也已完成对它各种场景的适配,除了以上rownum解释的简单功能,我们对Oracle中rownum的功能场景扩展进行深度挖掘实现,包括rownum嵌套查询,ORDER BY 场景,层次查询,distinct场景,与非常量数字结合的表达式场景等rownum伪列可以实现的各种场景。

      在说明之前,咱们先准备测试的一张基础数据表,员工表如下:

CREATE TABLE hi_emp (    empno NUMERIC(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,    ename VARCHAR2(10),    job VARCHAR2(9),    mgr NUMERIC(4),    sal NUMERIC(7,2),    comm NUMERIC(7,2),    deptno NUMERIC(2));
INSERT INTO hi_emp VALUES (7839,'KING','PRESIDENT',NULL,5000,NULL,10);INSERT INTO hi_emp VALUES (7369,'SMITH','CLERK',7902,800,NULL,20);INSERT INTO hi_emp VALUES (7499,'ALLEN','SALESMAN',7698,1600,300,30);INSERT INTO hi_emp VALUES (7521,'WARD','SALESMAN',7698,1250,500,30);INSERT INTO hi_emp VALUES (7566,'JONES','MANAGER',7839,2975,NULL,20);INSERT INTO hi_emp VALUES (7654,'MARTIN','SALESMAN',7698,1250,1400,30);INSERT INTO hi_emp VALUES (7698,'BLAKE','MANAGER',7839,2850,NULL,30);INSERT INTO hi_emp VALUES (7782,'CLARK','MANAGER',7839,2450,NULL,10);INSERT INTO hi_emp VALUES (7788,'SCOTT','ANALYST',7566,3000,NULL,20);INSERT INTO hi_emp VALUES (7844,'TURNER','SALESMAN',7698,1500,0,30);INSERT INTO hi_emp VALUES (7876,'ADAMS','CLERK',7788,1100,NULL,20);INSERT INTO hi_emp VALUES (7900,'JAMES','CLERK',7698,950,NULL,30);INSERT INTO hi_emp VALUES (7902,'FORD','ANALYST',7566,3000,NULL,20);INSERT INTO hi_emp VALUES (7934,'MILLER','CLERK',7782,1300,NULL,10);
复制


1、rownum行编号的功能

     跟oracle一样,Halo数据库系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推。如下图所示:

 

2、rownum用来限制查询返回的总行数

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

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


(2)rownum对于大于某值或者大于等于某值的查询条件
如果想找到从第二行记录以后的记录,当使用rownum>1或者rownum>=2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,跟Oracle一样, Halo也认为rownum> n(n>0的自然数)或者rownum>= n(n>1的自然数)这种条件依旧不成立,所以查不到记录。如下图所示:


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


3、rownum不能以任何表的名称作为前缀。

rownum伪列不可以有前缀,跟Oracle一样,会提醒报错处理。如下图所示:

 


4、嵌套查询rownum功能

跟Oracle一样,如果子查询里想查找第三行以后的记录,可使用以下的子查询方法可以解决。如下图所示:


 5、与ORDER BY 结合使用

Oracle处理是先对查询结果行先编号,后排序。根据这个规则,所取empno最小的两行的结果集显示的编号是没排序前的编号,如下图所示: 


6、层次查询

跟Oracle 一样,生成想要的整数序列。 如下图所示:


跟oracle一样,还有一种特殊情况,rownum与层次查询结合,会生成特殊的结果集,也就是结果集与rownum限制参数不一致的情况。如下图所示:

在这里,跟你们解释一下原理,你们就明白了,它的原理是先层次查询,再取rownum行数,没有取到的ROOT节点再拼接到结果集。 

7、distinct查询

跟Oracle一样,distinct与rownum结合使用,也会产生与我们设想不一致的结果集,因为他是先取结果集,再进行distinct操作。

 


8、与非常量数字结合的表达式

跟Oracle一样,rownum不仅仅与常量结合作为限制行数的条件,也可以跟其他非常量结合生成表达式作为条件使用。如下图所示: 


除了以上比较经典的场景,我们根据对Oracle深度探究,已经基本上完成了适配Oracle rownum的场景。Halo数据库已经可以跟Oracle rownum语句达到无缝衔接,像其他的UPDATE、DELETE,函数参数以及各种子句表达式等等场景适配,因为篇幅有限,我就不一一列举说明了。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

冷狼
暂无图片
1年前
评论
暂无图片 0
对于Oracle rownum特性解释,它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推;这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。rownum伪列是Oracle数据库中最重要的功能模块之一,因此Halo数据库在Oracle模式也已完成对它各种场景的适配,除了以上rownum解释的简单功能,我们对Oracle中rownum的功能场景扩展进行深度挖掘实现,包括rownum嵌套查询,ORDER BY 场景,层次查询,distinct场景,与非常量数字结合的表达式场景等rownum伪列可以实现的各种场景
1年前
暂无图片 点赞
评论