在 Oracle Database 12c 中将 NOT IN 替换为 OUTER JOIN

Posted

技术标签:

【中文标题】在 Oracle Database 12c 中将 NOT IN 替换为 OUTER JOIN【英文标题】:Replacing NOT IN with an OUTER JOIN in Oracle Database 12c 【发布时间】:2017-08-05 17:47:27 【问题描述】:

在下面描述的场景中,以下两个查询实现了相同的结果: “我想从名为 PRODUCT 的表中选择未出现在名为 PC 的单独表中的所有模型” 这可以通过以下代码完成:

select model
from product
where model not in(
select model from pc);

这也可以通过使用 OUTER JOIN 来完成:

select product.model, pc.model
from product left join pc
on product.model = pc.model
where pc.model is null;

看到这两个查询获得相同的结果,一个比另一个更可取吗?使用 OUTER JOIN 代替 NOT IN 有什么好处吗?

【问题讨论】:

这取决于平台、表的大小、定义的索引等。如果您查看执行计划,您可以更好地了解“幕后”发生的事情.您应该期望在这个简单的案例中没有区别。 现在大多数查询优化器都应该将两个查询优化到同一个计划。 检查this question。我个人也大多使用 NOT EXISTS。 严格来说这两个查询是不等价的,如果modelproduct表中为空,那么第一个查询总是跳过这条记录,而第二个查询总是包含这条记录。其次,如果pc 表中有 NULL 值,您将总是从第一个查询中得到一个空的结果集,而第二个查询总是给出非空的结果集。有人可能会说你在比较苹果和橙子,然后问:“哪个更好,苹果还是橙子”。 【参考方案1】:

我认为这将帮助您更好地理解它:http://www.sqlinthewild.co.za/index.php/2010/03/23/left-outer-join-vs-not-exists/

【讨论】:

以上是关于在 Oracle Database 12c 中将 NOT IN 替换为 OUTER JOIN的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 12C pluggable database自启动

甲骨文大学网络直播:聚焦Oracle Database 12c新特性

Mac OSX 上 VM 中的 Oracle Database 12c

最新发布:Oracle Database 12c Certified Master考试

Oracle Database 12c Release 2安装详解

Oracle Database 12c安装