取得表中第到第條記錄的值
第一種方法使用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的執行效率要高很多很多
From:http://tw.wingwit.com/Article/program/Oracle/201311/17083.html