3
select objectid
      ,name
      ,address
 from library_t l 
 where not exists (select *
                     from d107 d 
                    where l.objectid = d.objectid
                   )

select objectid
      ,name
      ,address
  from library_t l 
  where l.objectid not in (select objectid 
                             from d107
                          )

如果两个 objectid 列都有索引,在 oracle 中哪个更好?

4

3 回答 3

11

使用NOT EXISTS.

目前执行计划可能是相同的,但是如果将来更改任一列以允许 NULL,则 NOT IN 版本将需要做更多的工作。

关于 NOT EXISTS 和 NOT IN,需要注意的最重要的一点是,与 EXISTS 和 IN 不同,它们并非在所有情况下都等价。具体来说,当涉及 NULL 时,它们将返回不同的结果。具体来说,当子查询返回一个空值时,NOT IN 将不匹配任何行。

于 2012-10-21T11:31:14.113 回答
3

[NOT] IN[NOT] EXISTS运算符的处理方式不同。[NOT] IN处理起来更像是一个连接,而[NOT] EXISTS处理起来更像是一个带IF条件的循环。当然,选择一个而不是另一个取决于一种情况:驱动和驱动查询返回的数据量。在[NOT] IN运算符内部查询的情况下(..where id in (select id from table ))是驱动查询,而在[NOT] EXISTS外部查询的情况下是驱动查询。因此,如果子查询(内部查询)由于子查询中的表包含而返回少量数据[NOT] IN如果子查询返回的数据量大或者主要过滤发生在外查询[NOT] EXISTS算 子上,行数少或者有密集过滤可能会提供更好的性能。

于 2012-10-21T21:05:48.570 回答
2

他们都做一个子查询。更快的是:

select lib.objectid, lib.name, lib.address
from library_t lib
     left outer join d107 dd on lib.objectid = dd.objectid
where dd is null
于 2012-10-21T11:44:23.613 回答