在 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。 严格来说这两个查询是不等价的,如果model
在product
表中为空,那么第一个查询总是跳过这条记录,而第二个查询总是包含这条记录。其次,如果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考试