Oracle 数据伪列ROWNUM、RUMID介绍与示例
数据伪列指的是用户不需要处理的列,而是由Oracle自行维护的数据列,在Oracle之中有两个数据伪列:ROWNUM、RUMID
?
ROWNUM
?
SELECT ROWNUM ,empno, ename, job, hiredate, sal FROM emp;
?? ? ? ?
?
此时的ROWNUM行号并不是永久固定的;
?
SELECT ROWNUM ,empno, ename, job, hiredate, sal FROM emp WHERE deptno = 30;
?
?
示例:查询前5条记录
?
SELECT ROWNUM,empno , ename ,job, hiredate, sal FROM emp WHERE ROWNUM<=5;
?
?
示例:查询6~10记录
按照正常思维肯定是直接进行BETWEEN…AND的判断;
SELECT ROWNUM empno, ename, job, hiredate ,sal FROM emp WHERE ROWNUM BETWEEN 6 AND 10;
?
这个时候并没有返回任何的数据,因为ROWNUM不是真实列,而要想真正的实现这种查询思路是:先查询前10条记录,之后再显示后5条记录,要依靠子查询完成
SELECT * FROM( SELECT ROWNUM rn,empno,ename,job,hiredate,sal FROM emp WHERE ROWNUM<=10) tempWHERE temp.rn>5; //temp.rn>5表示显示5条后的数据
?
如果现在按照这个思路,下面就可以给出分页程序中所需要的功能实现
示例:显示前5条记录
第一页:
SELECT * FROM( SELECT ROWNUM rn, empno, ename, job, hiredate, sal FROM emp WHERE ROWNUM<=5) tempWHERE temp.rn>0;
?
范例:显示中间的5条记录
当前所在页(currentPage)为2;
第二页:
SELECT * FROM( SELECT ROWNUM rn,empno,ename,job,hiredate,sal FROM emp WHERE ROWNUM<=10) tempWHERE temp.rn>5;
?
示例:显示第三页的内容,currentPage=3,lineSize=10;
SELECT * FROM( SELECT ROWNUM rn, empno, ename, job, hiredate ,sal FROM emp WHERE ROWNUM<=15) tempWHERE temp.rn>10;
ROWID
ROWID表示的是每一行数据保存的物理地址的编号。例如,观察如下的查询:
SELECT ROWID, deptno , dname, loc FROM dept;
?
??
每一条记录ROWID都不会重复,所以即便表中所有列的数据内容都重复了,ROWID也是不会重复的,而且以一个ROWID为例,说明ROWID组成,例如:
AAAR3qAAEAAAACHAAB
<!--[if !supportLists]-->·? ? ??
?现在项目之中由于管理不善,所以导致出现了许多重复记录
?先按照查询的方式做,首先找到所有重复的数据,重复的数据就比较容易,按照部门名称及位置分组,之后统计个数,如果告诉大于1,则表示重复
select min(rowid) from dept group by dname, loc;
?
?
以上的数据是不删除的,所以下面编写DELETE语句:
DELETE FROM deptWHERE ROWID NOT IN(SELECT MIN(ROWID)FROM deptGROUP BY dname, loc); COMMIT;
?
1 楼 asiazhao 昨天 DELETE FROM dept a where exists(selecx 1 from dept b where b.name=a.name and b.loc=a.loc and b.rowid<a.rowid);