exists、in的运用场景
能不写子查询,尽量不写子查询,而是直接编写多表连接操作。理由如下:
① oracle CBO在parse阶段,会尽可能把子查询转化为多表连接
② 子查询可读性较低 www.2cto.com
③ 复杂的逻辑,子查询可能导致oracle CBO选择错误的执行路径
但如果必须写子查询,到底是in还是exists?exists/not exists专门用于关联子查询。10g之后,oracle对in的改进,这两者无甚区别。
in和select的技术原理:
㈠ in:先进行子查询,再进行主查询
㈡ exists:先进行主查询,再到子查询中过滤
in和exists的使用建议:
Ⅰ 如果限制性强的条件在子查询,则使用in
Ⅱ 如果限制性强的条件在主查询,则使用exists
可用查询结果集来理解上面这段话,采用最优化匹配原则:拿最小记录匹配大记录。限制性强,则结果集小;反之,则大。
注释:
① 使用exists可以将子查询结果定位常量,不影响查询结果,而且,效率高。
比如:
[sql]
select e.*
from emp e
where exists
(select 1 from dept d
where e.deptno=d.deptno and
d.dname='SALES')
www.2cto.com
② not in可能会因为null而改变其行为导致和not exists结果集有出入。然而,在相关子查询下,not in和not exists的结果集是一样的。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29446986/viewspace-2065212/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29446986/viewspace-2065212/