如何取得表中第6到第10條記錄的值。
第一種方法,使用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;
另外一種方法,採用子查詢:
子查詢的這種方法相對比較複雜一點,不過效能要比剛才的集合相減要好一些。這種方法首先在子查詢中得到前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條資料了。
利用外連線替代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的執行效率要高很多很多。
巧取oracle指定記錄
1 取得表中第6到第10條記錄的值 1.1 第一種方法,使用minus語句 假設ddl語句如下 以下是引用片段 create table t id varchar2 4 primary key,value int 那麼第一種方法就是取出前5條,再取出前10條,然後採用集合運算的方法把前10條減去前5...
巧取指定記錄與外關聯查詢
1 取得表中第6到第10條記錄的值 1.1 第一種方法,使用minus語句 假設ddl語句如下 create table t id varchar2 4 primary key,value int 那麼第一種方法就是取出前5條,再取出前10條,然後採用集合運算的方法把前10條減去前5條就ok了,sq...
oracle中按行查詢指定記錄數
1 輸出表的第一行記錄 select from table name where rownum 1 2 輸出表的前兩行記錄 select from table name where rownum 3 3 輸出表中從 select from select rownum m,a.from table n...