取得表中第到第条记录的值
第一种方法使用minus语句
假设ddl语句如下
CREATE TABLE T(ID VARCHAR() PRIMARY KEY VALUE INT)
那么第一种方法就是取出前条再取出前条然后采用集合运算的方法把前条减去前条就OK了SQL语句如下
SELECT * FROM T WHERE ROWNUM <=
MINUS
SELECT * FROM T WHERE ROWNUM <= ;
另外一种方法采用子查询
子查询的这种方法相对比较复杂一点不过性能要比刚才的集合相减要好一些这种方法首先在子查询中得到前条数据顺路也取得前条数据的rownum然后再一次查询的时候取得刚才查询的rownum大于的那些数据SQL语句如下
SELECT ID VALUE FROM
(SELECT ID VALUE ROWNUM R FROM T WHERE R <= )
WHERE
R > ;
通过上面的语句就得到了到第条数据了
利用外连接替代not in语句
in语句还有not in语句的效率是非常的差的因为数据库在遇到这两种语句的时候是要把数据进行一条一条的比对如果in或者not in两侧的数据量在上万条的时候进行比对的次数就是上亿次很可能一个简单的sql语句就要执行半个小时以上这种效率客户是肯定不能够接受的那我们可以考虑两种方法进行替代第一种就是采用exist语句和not exist语句这种大家应该比较熟悉了另外一种就是巧用外关联语句这种方法可能大家不是很熟悉我来稍微说一下假设数据表的建表DDL语句为
CREATE TABLE T(ID VARCHAR() PRIMARY KEY VALUE INT)
而in或者not in的表的建表DDL语句为
CREATE TABLE T(VALUE INT)
Oracle中外关联采用的是(+)符号表示外关联也就是说标识了(+)符号的部分在找不到对应的值的时候为NULL下面是替代in语句的时候的SQL语句
SELECT TID TVALUE
FROM T T
WHERE TVALUE = TVALUE(+)
AND TVALUE IS NOT NULL;
而类似的替代not in语句的时候的SQL语句则为
SELECT TID TVALUE
FROM T T
WHERE TVALUE = TVALUE(+)
AND TVALUE IS NULL;
大家可以试验一下在数据量多的时候采用外关联比用in或者not in的执行效率要高很多很多