Oracle兩則小技巧——巧取指定的記錄與巧用外關聯查詢

來源:互聯網
上載者:User
  

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.