取得表中第到第條記錄的值
第一種方法使用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 T
ID
T
VALUE
FROM T
T
WHERE T
VALUE = T
VALUE(+)
AND T
VALUE IS NOT NULL
而類似的
替代not in語句的時候的SQL語句則為
以下是引用片段
SELECT T
ID
T
VALUE
FROM T
T
WHERE T
VALUE = T
VALUE(+)
AND T
VALUE IS NULL
大家可以試驗一下
在數據量多的時候
采用外關聯比用in或者not in的執行效率要高很多很多
From:http://tw.wingwit.com/Article/program/Oracle/201311/18104.html