查詢哪些書沒有借出?
典型的查詢方式為:
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...