当前位置: 代码迷 >> Oracle开发 >> 菜鸟的EXISTS有关问题
  详细解决方案

菜鸟的EXISTS有关问题

热度:5   发布时间:2016-04-24 07:36:07.0
初学者的EXISTS问题
假设有一表,名A,只有两个字段,ID,NUM,现在我想查询NUM为1,10,20,30的记录
  可以写成语句
  select   *   from   A   where   ID   IN(1,10,20,30);
    怎么将上面的语句改成使用EXISTS的,不是说所有的IN语句都能改成使用EXISTS的吗?

------解决方案--------------------
EXISTS的执行流程
select * from t1 where exists ( select null from t2 where y = x )
可以理解为:
for x in ( select * from t1 )
loop
if ( exists ( select null from t2 where y = x.x )
then
OUTPUT THE RECORD
end if
end loop
对于in 和 exists的性能区别:
如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。
其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了

另外IN不对NULL进行处理
如:
select 1 from dual where null in (0,1,2,null)
为空
------解决方案--------------------
如果数据量很大的话,用exists效率会很慢的,因为针对外层查询的每一条记录都会去执行内层查询。好处是内层查询只需要检索到一条记录,外层查询就会返回相应结果,即内层查询的功能是判断有没有和外层查询关联的数据,而不具体查找记录。
  相关解决方案