Oracle笔记(七)数据更新、事务处理、数据伪列(二)

2014-11-24 15:14:16 · 作者: · 浏览: 3
5条记录,要依靠子查询完成。
SELECT * FROM(
SELECT ROWNUM m,empno,ename,job,hiredate,sal FROM emp
WHERE ROWNUM<=10) temp
WHERE temp.m>5;
如果现在按照这个思路,下面就可以给出日后程序中所需要分页的功能实现。
范例:显示前5条记录
当前所在页(currentPage)为1;
每页显示的记录长度(lineSize)为5;
第一页:
SELECT * FROM(
SELECT ROWNUM m,empno,ename,job,hiredate,sal FROM emp
WHERE ROWNUM<=5) temp
WHERE temp.m>0;
范例:显示中间的5条记录
当前所在页(currentPage)为2;
每页显示的记录长度(lineSize)为5;
第二页: www.2cto.com
SELECT * FROM(
SELECT ROWNUM m,empno,ename,job,hiredate,sal FROM emp
WHERE ROWNUM<=10) temp
WHERE temp.m>5;
范例:显示第三页的内容,currentPage=3,lineSize=10;
SELECT * FROM(
SELECT ROWNUM m,empno,ename,job,hiredate,sal FROM emp
WHERE ROWNUM<=15) temp
WHERE temp.m>10;
以上的程序就是分页显示操作的核心代码。
2、 ROWID
ROWID表示的是每一行数据保存的物理地址的编号,例如,观察如下的查询:
SELECT ROWID,deptno,dname,loc FROM dept;
此时返回许多的记录:
ROWID DEPTNO DNAME LOC
------------------ ---------- -------------- -------------
AAAL+XAAEAAAAANAAA 10 ACCOUNTING NEW YORK
AAAL+XAAEAAAAANAAB 20 RESEARCH DALLAS
AAAL+XAAEAAAAANAAC 30 SALES CHICAGO
AAAL+XAAEAAAAANAAD 40 OPERATIONS BOSTON
每一条记录的ROWID都不会重复,所以即便表中所有列的数据内容都重复了,ROWID也是不会重复的,而且以一个ROWID为例,说明ROWID组成,例如:AAAL+XAAEAAAAANAAA www.2cto.com
数据对象号:AAAL+X;
相对文件号:AAE;
数据块号:AAAAAN;
数据行号:AAA;
面试题:请删除表中的重复记录
现在项目之中由于管理不善,所以导致出现了许多重复的信息,为了说明问题,下面为表中增加若干条记录。
INSERT INTO dept(deptno,dname,loc) VALUES (21,'RESEARCH','DALLAS');
INSERT INTO dept(deptno,dname,loc) VALUES (31,'SALES','CHICAGO');
INSERT INTO dept(deptno,dname,loc) VALUES (32,'SALES','CHICAGO');
INSERT INTO dept(deptno,dname,loc) VALUES (41,'OPERATIONS','BOSTON');
INSERT INTO dept(deptno,dname,loc) VALUES (42,'OPERATIONS','BOSTON');
INSERT INTO dept(deptno,dname,loc) VALUES (43,'OPERATIONS','BOSTON');
COMMIT; www.2cto.com
此时的数据显示是:
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
21 RESEARCH DALLAS
31 SALES CHICAGO
32 SALES CHICAGO
41 OPERATIONS BOSTON
42 OPERATIONS BOSTON
43 OPERATIONS BOSTON
www.2cto.com
已选择10行。
现在要求删除掉所有重复的记录,保留最早增加的记录内容。
最终显示效果:
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
先按照查询的方式做,首先找到所有重复的数据,重复的数据就比较容易了,按照部门名称及位置分组,之后统计个数,如果个数大于1,则表示重复。
SELECT dname,loc,MIN(ROWID)
FROM dept
GROUP BY dname,loc
HAVING COUNT(deptno)>1;
此时返回的三个ROWID,与最早的ROWID比较一下。
ROWID DEPTNO DNAME LOC
------------------ ---------- -------------- -------------
AAAL+XAAEAAAAANAAA 10 ACCOUNTING NEW YORK
AAAL+XAAEAAAAANAAB 20 RESEARCH DALLAS
AAAL+XAAEAAAAANAAC 30 SALES CHICAGO
AAAL+XAAEAAAAANAAD 40 OPERATIONS BOSTON
SQL> SELECT dname,loc,MIN(ROWID)
2 FROM dept www.2cto.com
3 GROUP BY dname,loc
4 HAVING COUNT(deptno)>1;
DNAME LOC MIN(ROWID)
-------------- --