典型的查詢方式為:
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...