oracle中代替in 和not in 高效方法
生活随笔
收集整理的這篇文章主要介紹了
oracle中代替in 和not in 高效方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
-- 在oracle中效率排行:表連接>exist>not exist>in>not in;
-- 因此如果簡單提高效率可以用exist代替in進行操作,當然換成表連接可以更快地提高效率,
-- 具體是用left join代替not in 和not exist,用inner join 代替in和exist,這樣可以大大提高效率。具體例子如下:
-- A、NOT IN、NOT EXISTS的相關子查詢可以改用LEFT JOIN代替寫法。
-- 比如: SELECT PUB_NAME
FROM PUBLISHERS
WHERE PUB_ID NOT IN (SELECT PUB_ID FROM TITLES WHERE TYPE = 'BUSINESS')-- 可以改寫成: SELECT A.PUB_NAME
FROM PUBLISHERS A
LEFT JOIN TITLES B
ON B.TYPE = 'BUSINESS'
AND A.PUB_ID=B. PUB_IDWHERE B.PUB_ID IS NULL
-- (2)
SELECT TITLE
FROM TITLES
WHERE NOT EXISTS(SELECT TITLE_ID FROM SALES WHERE TITLE_ID = TITLES.TITLE_ID)-- 可以改寫成:
SELECT TITLE
FROM TITLES
LEFT JOIN SALES
ON SALES.TITLE_ID = TITLES.TITLE_IDWHERE SALES.TITLE_ID IS NULL -- B、 如果保證子查詢沒有重復 ,IN、EXISTS的相關子查詢可以用INNER JOIN 代替。比如:
SELECT PUB_NAME
FROM PUBLISHERS
WHERE PUB_ID IN (SELECT PUB_ID FROM TITLES
WHERE TYPE = 'BUSINESS') 可以改寫成:
SELECT DISTINCT A.PUB_NAME
FROM PUBLISHERS A
INNER JOIN TITLES B
ON B.TYPE = 'BUSINESS'
AND A.PUB_ID=B. PUB_ID-- 有兩個簡單例子,以說明 “exists”和“in”的效率問題1) select * from T1 where exists(select * from T2 where T1.a=T2.a) ;-- T1數據量小而T2數據量非常大時,T1<<T2 時,1) 的查詢效率高。2) select * from T1 where T1.a in (select T2.a from T2) ;-- T1數據量非常大而T2數據量小時,T1>>T2 時,2) 的查詢效率高。exists 用法:-- 1)句中的“select * from T2 where T1.a=T2.a” 相當于一個關聯表查詢,
--
-- 相當于“select * from T1,T2 where T1.a=T2.a”;“exists(xxx)”它只在乎括號里的數據能不能查找出來,是否存在這樣的記錄,如果存在,這1)句的where 條件成立。in的用法:2)句中的“select * from T1 where T1.a in (select T2.a from T2) ”,這里的“in”后面括號里的語句搜索出來的字段的內容一定要相對應,一般來說,T1和T2這兩個表的a字段表達的意義應該是一樣的,否則這樣查沒什么意義。---sql語句查詢中exists中為什么要用select 1?
select * from call_cdr_xz_200609 a where and a.ori_charge<>0 and exists(select 1 from special b where a.called_nbr like b.special_nbr||'%' and b.billing_state=0 )
--,好比這個,為什么要加select 1?括號中的條件字句不是恒成立的嗎,求解
如果有查詢結果,查詢結果就會全部被1替代(當不需要知道結果是什么,只需要知道有沒有結果的時候會這樣用),可以提高語句的運行效率,在大數據量的情況下,提升效果非常明顯
?
總結
以上是生活随笔為你收集整理的oracle中代替in 和not in 高效方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JP
- 下一篇: ORACLE NOT EXISTS不等值