1 取得表中第6到第10条记录的值
1.1 第一种方法,使用minus语句
假设ddl语句如下:CREATE TABLE T(ID VARCHAR2(4) PRIMARY KEY, VALUE INT)
那么第一种方法就是取出前5条,再取出前10条,然后采用集合运算的方法把前10条减去前5条就OK了,SQL语句如下
SELECT * FROM T WHERE ROWNUM <= 10
MINUS
SELECT * FROM T WHERE ROWNUM <= 5;
1.2 另外一种方法,采用子查询
子查询的这种方法相对比较复杂一点,不过性能要比刚才的集合相减要好一些。这种方法首先在子查询中得到前10条数据,顺路也取得前10条数据的rownum,然后再一次查询的时候取得刚才查询的rownum大于5的那些数据。SQL语句如下
SELECT ID, VALUE FROM
(SELECT ID, VALUE, ROWNUM R FROM T WHERE R <= 10)
WHERE
R > 5;
通过上面的语句,就得到了6到第10条数据了。
2 利用外连接替代not in语句
in语句还有not in语句的效率是非常的差的,因为数据库在遇到这两种语句的时候是要把数据进行一条一条的比对,如果in或者not in两侧的数据量在上万条的时候,进行比对的次数就是上亿次,很可能一个简单的sql语句就要执行半个小时以上。这种效率客户是肯定不能够接受的。那我们可以考虑两种方法进行替代,第一种就是采用exist语句和not exist语句,这种大家应该比较熟悉了。另外一种就是巧用外关联语句,这种方法可能大家不是很熟悉,我来稍微说一下。假设数据表的建表DDL语句为
CREATE TABLE T1(ID VARCHAR2(4) PRIMARY KEY, VALUE INT)
而in或者not in的表的建表DDL语句为
CREATE TABLE T2(VALUE INT)
Oracle中外关联采用的是(+)符号表示外关联,也就是说标识了(+)符号的部分在找不到对应的值的时候为NULL。下面是替代in语句的时候的SQL语句
SELECT T1.ID, T1.VALUE
FROM T1, T2
WHERE T1.VALUE = T2.VALUE(+)
AND T2.VALUE IS NOT NULL;
而类似的。替代not in语句的时候的SQL语句则为
SELECT T1.ID, T1.VALUE
FROM T1, T2
WHERE T1.VALUE = T2.VALUE(+)
AND T2.VALUE IS NULL;
大家可以试验一下,在数据量多的时候,采用外关联比用in或者not in的执行效率要高很多很多。
http://tb.blog.csdn.net/TrackBack.aspx?PostId=1473286
oracle中巧取指定的记录与巧用外关联查询
时间: 2024-10-29 10:34:14
oracle中巧取指定的记录与巧用外关联查询的相关文章
Oracle巧取指定记录与巧用外关联查询
1 取得表中第6到第10条记录的值 1.1 第一种方法,使用minus语句 假设ddl语句如下: CREATE TABLE T(ID VARCHAR2(4) PRIMARY KEY, VALUE INT) 那么第一种方法就是取出前5条,再取出前10条,然后采用集合运算的方法把前10条减去前5条就OK了,SQL语句如下 SELECT * FROM T WHERE ROWNUM <= 10MINUSSELECT * FROM T WHERE ROWNUM <= 5; 1.2 另外一种方法,采用子查
oracle中批量取statspack的脚本
做了一个脚本sprpt_batch.sh: read line snap_i_id=$1 end_snap=$2 sqlplus -s /nolog<<EOF conn /as sysdba; define begin_snap=${snap_i_id}; define end_snap=${end_snap}; define report_name=sprpt_batch_${snap_i_id}_${end_snap}.txt set echo off set feedback off
oracle中如何按指定条数批量处理
示例 --每处理10000条提交一次 loop insert into t2 select * from t1 where rownum <= 10000; --每次插入10000条 delete from t1 where rownum <= 10000; --每次删除10000条 v_rowcount := sql%rowcount; commit; exit when v_rowcount < 10000; --如果提交条数小于10000,说明已经是最后一次处理
Oracle中如何查看指定分区表的每个子分区行数
批量获取指定分区表的每个子分区行数! 不然手动查询太麻烦! ---查看指 定分区表的每个子分区行数 create or replace procedure show_tabparcnt (partiton_tablename in user_tab_partitions.table_name%type ) --输入参数 as TYPE cur IS REF CURSOR RETURN user_tab_partitions%RowType; --声明游 标类型为ref a cur;
Oracle中如何生成指定范围内随机日期
/* * Oracle将日期作为过去某个关键日期(这个日期是公元前4712年1月1日)的整数偏移量来保存(即把日期保存为一个数字); * 因此可通过寻找'指定日期'与'关键日期'相对应的整数偏移量,再加一个指定范围内的随机整数来生成一个指定范围内的随机日期. */ 步骤: 1. 先找到'指定日期'与'关键日期'相对应的整数偏移量,格式为'J': SQL>select to_char(sysdate,'J') from dual; --系统给的结果是: 2456191 2. 生成指定范围[min_
在Oracle中如何利用Rowid查找和删除表中的重复记录
oracle|重复|重复记录 平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录. 下面总结一下几种查找和删除重复记录的方法(以表CZ为例):表CZ的结构如下:SQL> desc cz Name Null? Type ----------------------------------------- -------- ------------
oracle和sql server取第一条记录的区别以及rownum详解
我们知道学生可能有重名的情况,那么当重名的时候假设只需要取得重名结果集中的第一条记录. sql server:select top(1) num,Name from M_Student where name = 'xy' Oracle:select num,Name from M_Student where name = 'xy' and rownum <= 1 对于rownum在oracle的使用的时候,有几点需要注意: (1) rownum 对于等于某值的查询条件 如果希望找到学
Oracle数据库如何搜集指定SQL的执行计划和解决过程中的ORA-00904错误
Oracle 数据库如何搜集指定SQL的执行计划和解决过程中的ORA-00904错误 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处;否则请与本人联系,违者必究) 如何收集指定SQL的执行计划对开发人员来说非常重要的,这里记录下基础的收集方式,以便查阅和其他人参考. 1. 链接到sqlplus,如下图 2. 执行下面两个的命令之一 set autotrace on; (说明:打开自动分析统计,并显示SQL语句的运行结果) 3. 输入并执行要搜集执行计划的SQL语句
ORACLE中查询第n条到第m条的数据记录的方法
一.经过测试,下面的方法通过: SELECT * FROM ( SELECT 表名.*, ROWNUM AS CON FROM 表名 WHERE ROWNUM <= M AND 其它查询条件 ORDER BY 排序条件 )WHERE CON >=N; 二.参考其它网上的方法 SQL/Oracle取出第 m 条到第 n 条记录的方法 用一句SQL取出第 m 条到第 n 条记录的方法 用一句SQL取