ORACLE中NOT IN 的替代

ORACLE中NOT IN 的替代

典型的查询方式为:
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 的替代)