Oracle用左连接替换不在

Posted

技术标签:

【中文标题】Oracle用左连接替换不在【英文标题】:Oracle replace not in by left join 【发布时间】:2016-11-11 15:33:41 【问题描述】:

我正在尝试创建一个清理脚本来清除所有未使用的描述: 我的查询看起来像:

DELETE FROM DESCRIPCIONES WHERE ID_DESCRIPCION NOT IN
(SELECT ID_NOMBRE FROM CUESTIONARios 
UNION
SELECT ID_DESCRIPCION FROM CUESTIONARIOS 
UNION
SELECT ID_NOMBRE FROM PLANTILLAS
....
)

此外,我在此查询中有更多的 UNION。这就是为什么此查询需要太多时间的原因。有没有办法用更快的 LEFT JOIN 替换此查询并避免嵌套查询。 PD:甲骨文11g

谢谢

【问题讨论】:

SQL 问题和大喊大叫的标题是怎么回事? 没有得到你的问题... 用 union all 替换所有这些 un​​ion 可以获得一些性能优势 @KapitulaAlexey 我看到很多与 SQL 相关的问题都是大写的。我只是好奇为什么会这样。 ID_DESCRIPTION NOT IN ID_NOMBRE 是描述并命名您要比较的东西?或者子查询应该只包含ID_DESCRIPTION 的选择。同样正如 Boneist 所说,使用 union all 而不是 union,您应该更快地获得结果。 【参考方案1】:

最后我使用了下一个查询:

DELETE FROM DESCRIPCIONES WHERE ID_DESCRIPCION NOT IN
(SELECT ID_NOMBRE FROM CUESTIONARIOS 
UNION ALL
SELECT ID_DESCRIPCION FROM CUESTIONARIOS 
UNION ALL
SELECT ID_NOMBRE FROM PLANTILLAS
....
)

并获得了巨大的性能提升,感谢大家!

【讨论】:

以上是关于Oracle用左连接替换不在的主要内容,如果未能解决你的问题,请参考以下文章

左连接和右连接有啥区别

左外连接与右外连接区别?

sql 各种连接的使用条件,

Oracle使用左外连接时,左表中的一个id在右表(数据表以天为单位)中没有数据 使用nvl替换为0

左连接新认识

mysql左连接没有数据还会查出来吗