对于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对于大于某值或者大于等于某值的查询条件
(3)rownum对于小于某值或者小于等于某值的查询条件
3、rownum不能以任何表的名称作为前缀。
4、嵌套查询rownum功能
5、与ORDER BY 结合使用
6、层次查询
跟oracle一样,还有一种特殊情况,rownum与层次查询结合,会生成特殊的结果集,也就是结果集与rownum限制参数不一致的情况。如下图所示:
在这里,跟你们解释一下原理,你们就明白了,它的原理是先层次查询,再取rownum行数,没有取到的ROOT节点再拼接到结果集。
7、distinct查询
8、与非常量数字结合的表达式
除了以上比较经典的场景,我们根据对Oracle深度探究,已经基本上完成了适配Oracle rownum的场景。Halo数据库已经可以跟Oracle rownum语句达到无缝衔接,像其他的UPDATE、DELETE,函数参数以及各种子句表达式等等场景适配,因为篇幅有限,我就不一一列举说明了。
评论
