典型的查询方式为:
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 可能无法使用这些索引。