2016-01-09 学习笔记1 Orcale rownum rowid

本文介绍了Oracle数据库中ROWNUM的功能与应用,包括其作为伪数列的特点,并提供了几种实用的方法来处理表中的重复数据,例如完全删除或保留一条记录。

rownum是在得到结果的时候产生,用于标记结果集中结果顺序的一个字段,这个字段被称为”伪数列“,也就是实施不存在的一个数列,他的特点是按顺序标记,而且是”逐次通知“,换句话说只有存在rownum=1的记录,才可能存在rownum=2的记录
假设我们查询条件为rownun=2,那么查出的第一条数据记录的时候,orcale标记此条记录rownum为1,结果发现和rownum=2条件不符,于是结果为空

select rowid,empno,ename from emp where rowid='AAAMgAAEAAAAgAAB'

如何删除重复数据,name age同时相同视为重复
1、重复数据完全删除

selet name,age,count(*) from tb_test group by age,name havig count(*)>1

2、保留其中一条数据

--1.创建临时表
create table tb_tmp as select distinct name,age from tb_test;
trunate table tb_test;   --清空表记录
insert into tb_test selet * from tb_tmp; --将临时表中数据插回原表
--2.利用rowid
delete from tb_test where rowid in(
        select  a.rowid from tb_test a,tb_test b where 
                a.rowid>b.rowid and a.name=b.name and a.age=b.age) 
--3.max or in
delete from tb_test a where rowid not in 
    (select max(b.rowid) from tb_test b where a.name=b.name and a.age=b.age)
--4.
delete from tb_test where rowid not in(
    select max(rowid) from tb_test t group by t.name,t.age);    
<think>好的,我现在需要处理用户关于Oracle和Kingbase8中rownum用法及差异的问题。首先,我得回顾一下用户提供的引用资料,尤其是引用[3],那里提到了KingbaseES中rownum与limit的执行计划区别。用户可能已经知道KingbaseES(可能版本8)中的rownum行为,但需要详细比较Oracle和Kingbase8的具体用法和不同点。 首先,我需要确认Oracle中的rownum是如何工作的。Oracle的rownum是伪列,在查询结果返回前分配,通常用于限制返回的行数,比如WHERE rownum <= 10。但要注意,rownum是在数据过滤和排序前分配的,所以直接用于分页可能会有问题,通常需要子查询来处理。 接下来,查看Kingbase8的情况。根据引用[3],KingbaseES(可能Kingbase8)支持rownum,但行为可能与Oracle不同。比如,执行计划显示KingbaseES在处理rownum时可能结合了排序和过滤的顺序,影响性能。另外,引用中还提到limit关键字的存在,可能Kingbase8同时支持rownum和limit,而两者在优化器处理上有差异。 需要比较两者的语法差异。例如,在Oracle中常用rownum做分页,而Kingbase8可能更推荐使用limit,或者两者并存但执行方式不同。此外,引用[3]提到KingbaseES的rownum可能需要结合排序和索引使用来优化性能,而limit可能更直接。 还要注意大小写敏感的问题,引用[1]提到KingbaseES默认大小写敏感,可能在对象名处理上影响查询,但不确定是否影响rownum的使用,但用户可能需要知道这些配置差异。 总结差异点时,应包括语法、执行顺序、分页实现方式、性能优化建议等。同时,需要引用提供的资料来支持回答,比如引用[3]中的执行计划示例,说明rownum在Kingbase中的处理方式。 可能用户的实际需求是在迁移Oracle应用到Kingbase8时,处理rownum相关查询的适配问题,因此需要强调迁移时的注意事项,比如是否需要改用limit,或调整查询结构。此外,是否需要调整数据库配置,如大小写敏感或兼容模式,引用[1]中提到配置Oracle兼容开关可能相关。 最后,生成相关问题时要围绕迁移中的常见问题,比如语法转换、性能调优、兼容性设置等,帮助用户进一步解决可能遇到的困难。</think>### Oracle与Kingbase8中ROWNUM的用法与差异分析 #### 一、ROWNUM在Oracle中的核心特性 1. **伪列特性** ROWNUM是Oracle特有的伪列,在数据**读取过程中动态生成**,表示结果集的临时行编号。例如: ```sql SELECT * FROM employees WHERE ROWNUM <= 10; -- 返回前10条原始数据 ``` 注意:ROWNUM在**WHERE子句过滤前**分配,因此直接用于分页查询需嵌套子查询[^3]。 2. **分页实现方法** 典型的分页查询需结合排序和子查询: ```sql SELECT * FROM (SELECT t.*, ROWNUM rn FROM (SELECT * FROM employees ORDER BY hire_date) t WHERE ROWNUM <= 20) WHERE rn > 10; ``` #### 二、Kingbase8的ROWNUM兼容实现 1. **语法兼容性** Kingbase8通过**Oracle兼容模式**支持ROWNUM伪列,但执行逻辑存在差异: ```sql SELECT * FROM employees WHERE ROWNUM <= 10; -- 行为类似Oracle ``` 2. **与LIMIT关键字的对比** Kingbase8同时支持**LIMIT**语法(源自PostgreSQL),其执行计划更高效: ```sql SELECT * FROM employees ORDER BY id LIMIT 10 OFFSET 10; -- 推荐的分页方式 ``` *差异对比*: - **ROWNUM**:在过滤条件后执行编号分配,可能导致全表扫描[^3] - **LIMIT**:优化器可直接结合索引进行范围扫描 #### 三、关键差异对比表 | 特性 | Oracle | Kingbase8 | |---------------------|----------------------|-------------------------------| | **执行顺序** | WHERE前分配ROWNUM | WHERE后分配ROWNUM[^3] | | **分页性能** | 依赖子查询优化 | LIMIT+OFFSET更高效 | | **索引利用** | 复杂查询可能失效 | LIMIT能更好利用索引 | | **兼容性配置** | 原生支持 | 需开启`oracle_compatible`参数 | #### 四、迁移实践建议 1. **查询重写策略** - 简单分页查询可改为LIMIT语法 - 复杂ROWNUM嵌套查询需验证执行计划 ```sql -- Oracle原语句 SELECT * FROM (SELECT t.*, ROWNUM rn FROM table t) WHERE rn BETWEEN 11 AND 20; -- Kingbase8改进 SELECT * FROM table ORDER BY id LIMIT 10 OFFSET 10; ``` 2. **性能优化要点** - 对含ROWNUM的查询执行`EXPLAIN`分析 - 优先为ORDER BY字段创建索引 - 大数据量分页建议使用游标分页 3. **兼容性配置** 在`kingbase.conf`中启用: ```ini oracle_compatible = on case_sensitive = off -- 与Oracle大小写特性对齐[^1] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值