Oracle巧取相關(guān)的指定記錄實操
Oracle巧取相關(guān)的指定記錄及巧用外的關(guān)聯(lián)查詢,此文章主要是利用實例的形式來解決Oracle巧取指定記錄和巧用外關(guān)聯(lián)查詢的相關(guān)問題。 如果你對這一技術(shù),心存好奇的話,以下的文章將會揭開它的神秘面紗。
如何取得表中第6到第10條記錄的值
第一種方法,使用minus語句:
假設(shè)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;
另外一種方法,采用子查詢:
子查詢的這種方法相對比較復(fù)雜一點,不過性能要比剛才的集合相減要好一些。這種方法首先在子查詢中得到前10條數(shù)據(jù),順路也取得前10條數(shù)據(jù)的rownum,然后再一次查詢的時候取得剛才查詢的rownum大于5的那些數(shù)據(jù)。SQL語句如下:
- SELECT ID, VALUE FROM
- (SELECT ID, VALUE, ROWNUM R FROM T WHERE R <= 10)
- WHERE
- R > 5;
通過上面的語句,就得到了6到第10條數(shù)據(jù)了。
利用外連接替代not in語句
in語句還有not in語句的效率是非常的差的,因為數(shù)據(jù)庫在遇到這兩種語句的時候是要把數(shù)據(jù)進行一條一條的比對,如果in或者not in兩側(cè)的數(shù)據(jù)量在上萬條的時候,進行比對的次數(shù)就是上億次,很可能一個簡單的sql語句就要執(zhí)行半個小時以上。這種效率客戶是肯定不能夠接受的。
那我們可以考慮兩種方法進行替代,第一種就是采用exist語句和not exist語句,這種大家應(yīng)該比較熟悉了。另外一種就是巧用外關(guān)聯(lián)語句,這種方法可能大家不是很熟悉,我來稍微說一下。假設(shè)數(shù)據(jù)表的建表DDL語句為
- CREATE TABLE T1(ID VARCHAR2(4) PRIMARY KEY, VALUE INT)
而in或者not in的表的建表DDL語句為:
- CREATE TABLE T2(VALUE INT)
Oracle巧取指定記錄以及巧用外關(guān)聯(lián)查詢中外關(guān)聯(lián)采用的是(+)符號表示外關(guān)聯(lián),也就是說標(biāo)識了(+)符號的部分在找不到對應(yīng)的值的時候為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;
大家可以試驗一下,在數(shù)據(jù)量多的時候,采用外關(guān)聯(lián)比用in或者not in的執(zhí)行效率要高很多很多。
文章出自: http://www.programbbs.com/doc/class10-1.htm
【編輯推薦】