ORACLE中NOT IN 的替代

2021-05-24 09:49:04 字數 899 閱讀 5238

典型的查詢方式為:

select title

from bookshelf

where title not in

(select title from bookshelf_checkout)

order by title;

如果bookshelf_checkout很大的話,速度可能會很慢,因為oracle會在bookshelf_checkout上執行乙個時間密集型的全表掃瞄。

oracle 中not in 效率不高

一:使用外部連線

select distinct c.title

from bookshelf_checkout b right outer join bookshelf c

on b.title = c.title

where b.title is null

order by c.title ;

優化後的程式可以使用連線列上的索引。

where b.title is null

表示不出現在bookshelf_checkout中的title列 (oracle作為null列返回,可參考外部連線方面的內容) 二:

使用not exists

select b.title

from bookshelf b

where not exists

(select 'x' from bookshelf_checkout c

where c.title = b.title)

order by b.title

對於bookshelf中每乙個記錄和bookshelf_checkout匹配則是exists.not exists則是不存在的。

not exists往往可以使用可利用的索引,not in 可能無法使用這些索引。

ORACLE中NOT IN 的替代

查詢哪些書沒有借出?典型的查詢方式為 select title from bookshelf where title not in select title from bookshelf checkout order by title 如果bookshelf checkout很大的話,速度可能會很慢...

替代not in 和 in 的辦法

在程式中,我們經常會習慣性的使用in和not in,在訪問量比較小的時候是可以的,但是一旦資料量大了,我們就推薦使用not exists或者外連線來代替了。如果要實現一張表有而另外一張表沒有的資料時,我們通常會這麼寫 select from table t where t.id not in sel...

oracle中的not in問題

oracle中的not in問題 最近過程比較忙,沒日沒夜的,好久沒有時間寫部落格了,今天乙個特別詭異,特別蛋疼的問題糾結了好久,不得不寫個部落格了。www.2cto.com sql select from wlbtest3 where sname,sage not in select user n...