ORACLE中NOT IN 的替代

典型的查询方式为:SELECT TITLEFROM BOOKSHELFWHERE 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.TITLEWHERE B.TITLE IS NULLORDER BY C.TITLE ;优化后的程序可以使用连接列上的索引。WHERE B.TITLE IS NULL表示不出现在BOOKSHELF_CHECKOUT中的TITLE列 (ORACLE作为NULL列返回,可参考外部连接方面的内容)二:使用NOT EXISTSSELECT B.TITLEFROM BOOKSHELF BWHERE 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 可能无法使用这些索引。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>