文章詳情頁(yè)
Oracle巧取指定記錄以及巧用外關(guān)聯(lián)查詢(xún)
瀏覽:2日期:2023-11-26 08:27:20
本文中利用例子的形式來(lái)解決Oracle巧取指定記錄與巧用外關(guān)聯(lián)查詢(xún)問(wèn)題。 如何取得表中第6到第10條記錄的值 第一種方法,使用minus語(yǔ)句: 假設(shè)ddl語(yǔ)句如下: CREATE TABLE T(ID VARCHAR2(4) PRIMARY KEY, VALUE INT)那么第一種方法就是取出前5條,再取出前10條,然后采用集合運(yùn)算的方法把前10條減去前5條就OK了,SQL語(yǔ)句如下: SELECT * FROM T WHERE ROWNUM <= 10MINUSSELECT * FROM T WHERE ROWNUM <= 5;另外一種方法,采用子查詢(xún): 子查詢(xún)的這種方法相對(duì)比較復(fù)雜一點(diǎn),不過(guò)性能要比剛才的集合相減要好一些。這種方法首先在子查詢(xún)中得到前10條數(shù)據(jù),順路也取得前10條數(shù)據(jù)的rownum,然后再一次查詢(xún)的時(shí)候取得剛才查詢(xún)的rownum大于5的那些數(shù)據(jù)。SQL語(yǔ)句如下: SELECT ID, VALUE FROM (SELECT ID, VALUE, ROWNUM R FROM T WHERE R <= 10)WHERER > 5;通過(guò)上面的語(yǔ)句,就得到了6到第10條數(shù)據(jù)了。 利用外連接替代not in語(yǔ)句 in語(yǔ)句還有not in語(yǔ)句的效率是非常的差的,因?yàn)閿?shù)據(jù)庫(kù)在碰到這兩種語(yǔ)句的時(shí)候是要把數(shù)據(jù)進(jìn)行一條一條的比對(duì),假如in或者not in兩側(cè)的數(shù)據(jù)量在上萬(wàn)條的時(shí)候,進(jìn)行比對(duì)的次數(shù)就是上億次,很可能一個(gè)簡(jiǎn)單的sql語(yǔ)句就要執(zhí)行半個(gè)小時(shí)以上。這種效率客戶(hù)是肯定不能夠接受的。那我們可以考慮兩種方法進(jìn)行替代,第一種就是采用exist語(yǔ)句和not exist語(yǔ)句,這種大家應(yīng)該比較熟悉了。另外一種就是巧用外關(guān)聯(lián)語(yǔ)句,這種方法可能大家不是很熟悉,我來(lái)稍微說(shuō)一下。假設(shè)數(shù)據(jù)表的建表DDL語(yǔ)句為 CREATE TABLE T1(ID VARCHAR2(4) PRIMARY KEY, VALUE INT)而in或者not in的表的建表DDL語(yǔ)句為: CREATE TABLE T2(VALUE INT)Oracle中外關(guān)聯(lián)采用的是(+)符號(hào)表示外關(guān)聯(lián),也就是說(shuō)標(biāo)識(shí)了(+)符號(hào)的部分在找不到對(duì)應(yīng)的值的時(shí)候?yàn)镹ULL。下面是替代in語(yǔ)句的時(shí)候的SQL語(yǔ)句 SELECT T1.ID, T1.VALUE FROM T1, T2 WHERE T1.VALUE = T2.VALUE(+) AND T2.VALUE IS NOT NULL;而類(lèi)似的。替代not in語(yǔ)句的時(shí)候的SQL語(yǔ)句則為: SELECT T1.ID, T1.VALUE FROM T1, T2 WHERE T1.VALUE = T2.VALUE(+) AND T2.VALUE IS NULL;大家可以試驗(yàn)一下,在數(shù)據(jù)量多的時(shí)候,采用外關(guān)聯(lián)比用in或者not in的執(zhí)行效率要高很多很多。
標(biāo)簽:
Oracle
數(shù)據(jù)庫(kù)
排行榜
