rowid 和 rownum的使用
2013-02-27 10:44
316 查看
两者都是伪列,
rowid 多用于
查找和删除重复记录
(1).适用于有大量重复记录的情况(列上建有索引的时候,用以下语句效率会很高):
Delete empa Where ROWID Not In(Select Min(ROWID) From empa Group By empno);
(2).适用于有少量重复记录的情况(注意,对于有大量重复记录的情况,用以下语句效率会很低):
Delete empa a where rowid<>(select max(rowid) from empa where empno=a.empno );
rownum是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号,所以只能用只能用符号(<、<=、!=).
1. select rownum,c1 from t1 where rownum != 10 为何是返回前9条数据呢?它与 select rownum,c1 from tablename where rownum < 10 返回的结果集是一样的呢?
因为是在查询到结果集后,显示完第 9 条记录后,之后的记录也都是 != 10,或者 >=10,所以只显示前面9条记录。也可以这样理解,rownum 为9后的记录的 rownum为10,因条件为 !=10,所以去掉,其后记录补上,rownum又是10,也去掉,如果下去也就只会显示前面9条记录了。
2. 为什么 rownum >1 时查不到一条记录,而 rownum >0 或 rownum >=1 却总显示所有的记录?
因为 rownum 是在查询到的结果集后加上去的,它总是从1开始。
3. 为什么 between 1 and 10 或者 between 0 and 10 能查到结果,而用 between 2 and 10 却得不到结果?
原因同上一样,因为 rownum 总是从 1 开始。从上可以看出,任何时候想把 rownum = 1 这条记录抛弃是不对的,它在结果集中是不可或缺的,少了rownum=1 就像空中楼阁一般不能存在,所以你的 rownum 条件要包含到 1 。
select *
from (selet rownum as rn,t1.* from a where ...)
where rn >10
一般代码中对结果集进行分页就是这么干的。
如果rownum 和orderby 同时使用,必须先子查询orderby,再加上rownum; 或者在orderby的字段上加主键或索引即可让oracle先按该字段排序,然后再rownum;
区别:
另外:rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的一般列,所以以 rowid 为条件就不会有 rownum那些情况发生。
另外还要注意:rownum不能以任何基表的名称作为前缀。
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。
rowid 多用于
查找和删除重复记录
(1).适用于有大量重复记录的情况(列上建有索引的时候,用以下语句效率会很高):
Delete empa Where ROWID Not In(Select Min(ROWID) From empa Group By empno);
(2).适用于有少量重复记录的情况(注意,对于有大量重复记录的情况,用以下语句效率会很低):
Delete empa a where rowid<>(select max(rowid) from empa where empno=a.empno );
rownum是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号,所以只能用只能用符号(<、<=、!=).
1. select rownum,c1 from t1 where rownum != 10 为何是返回前9条数据呢?它与 select rownum,c1 from tablename where rownum < 10 返回的结果集是一样的呢?
因为是在查询到结果集后,显示完第 9 条记录后,之后的记录也都是 != 10,或者 >=10,所以只显示前面9条记录。也可以这样理解,rownum 为9后的记录的 rownum为10,因条件为 !=10,所以去掉,其后记录补上,rownum又是10,也去掉,如果下去也就只会显示前面9条记录了。
2. 为什么 rownum >1 时查不到一条记录,而 rownum >0 或 rownum >=1 却总显示所有的记录?
因为 rownum 是在查询到的结果集后加上去的,它总是从1开始。
3. 为什么 between 1 and 10 或者 between 0 and 10 能查到结果,而用 between 2 and 10 却得不到结果?
原因同上一样,因为 rownum 总是从 1 开始。从上可以看出,任何时候想把 rownum = 1 这条记录抛弃是不对的,它在结果集中是不可或缺的,少了rownum=1 就像空中楼阁一般不能存在,所以你的 rownum 条件要包含到 1 。
select *
from (selet rownum as rn,t1.* from a where ...)
where rn >10
一般代码中对结果集进行分页就是这么干的。
如果rownum 和orderby 同时使用,必须先子查询orderby,再加上rownum; 或者在orderby的字段上加主键或索引即可让oracle先按该字段排序,然后再rownum;
区别:
另外:rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的一般列,所以以 rowid 为条件就不会有 rownum那些情况发生。
另外还要注意:rownum不能以任何基表的名称作为前缀。
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。
相关文章推荐
- oracle_SQL中ROWID与ROWNUM的使用(转)
- 使用rowid和rownum获取记录时要注意的问题
- oracle_SQL中ROWID与ROWNUM的使用
- oracle_SQL中ROWID与ROWNUM的使用
- 菜鸟上路之oracle中rowid和rownum的使用 笔记整理
- oracle中rownum与rowid使用方法
- oracle_SQL中ROWID与ROWNUM的使用
- 关于在使用rowid和rownum时遇到ORA-01446错误的原因即解决方法。
- oracle_SQL中ROWID与ROWNUM的使用
- Oracle 的rownum 原理和使用 及与rowid的区别
- oracle_SQL中ROWID与ROWNUM的使用
- oracle中 rowid 和rownum的使用
- oracle_SQL中ROWID与ROWNUM的使用
- oracle中rowid与rownum的使用介绍
- 使用rowid和rownum获取记录时要注意的问题
- Oracle和SQL中ROWID与ROWNUM的使用
- ORACLE——ROWNUM解析(使用ROWNUM大于条件,无法得到任何查询结果)
- rownum和rowid
- Oracle中查询rownum和rowid的区别
- Rowid和Rownum的区别