ORACLE中NOT IN 的替代

2021-08-30 09:27:54 字數 1010 閱讀 4756

查詢哪些書沒有借出?

典型的查詢方式為:

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.titlefrom bookshelf_checkout b

right outer join bookshelf c on b.title = c.title

where b.title is null

order by c.title ;

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

[color=red]where b.title is null[/color]

表示不出現在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 (...) 括號中的返回值不能存在null值,如果不能確定返回結果一定無null值,還是改為not esists吧。而且not in效率低下,一般不能用到索引,生產環境的程式最好不要使用。

ORACLE中NOT IN 的替代

典型的查詢方式為 select title from bookshelf where title not in select title from bookshelf checkout order by title 如果bookshelf checkout很大的話,速度可能會很慢,因為oracle會...

替代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...