| 導購 | 订阅 | 在线投稿
分享
 
 
 

Oracle認證:巧取指定記錄與外關聯查詢

來源:互聯網網民  2008-05-31 00:48:00  評論

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的執行效率要高很多很多。

 
特别声明:以上内容(如有图片或视频亦包括在内)为网络用户发布,本站仅提供信息存储服务。
 
  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的執行效率要高很多很多。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有