日期:2014-05-17  浏览次数:20812 次

exists 的问题
帮助中EXISTS是这么定义的

exists    

    指定一个子查询,检测行的存在。            

    结果类型    

    Boolean    

    结果值    

    如果子查询包含行,则返回TRUE。    


我有两个表:    

    a    

    a1       a2              

    1           a          

    2           b
    3           c              

    b    

    b1       b2    
    1           a      

    2           b      

    3           d        
 

select   *   from   a   where   exists   (select   *   from   a   where   a1= '1 '   )
和预想中的一样select   *   from   a   where   a1= '1 '   返回了true
查到了a中的所有结果.
a1   a2
1   a
2   b
3   c
而select   *   from   a   where     exists   (select   a1   ,a2   from   b   where   a.a2=b.b2)
得到的结果是
a1   a2
1   a
2   b
和我预想的不一样
我认为exists只是返回true或false  
那么结果只能是true   返回a的所有记录,   false无结果.
select   *   from   a   where     exists   (select   a1   ,a2   from   b   where   a.a2=b.b2)
要怎么理解请指教.


------解决方案--------------------
在你的查询中exists后的语句是作为一个子查询存在的,也就是说对a表的每一行,都会去看一下在b表中是否存在一条满足b.b2等于本行的a.a2的值,如果有,则返回真,a中的该行记录被查询到,如果没有,则返回假,a中的该行记录被过滤掉;
查询中a表中的a2字段内容,只有 'c '在b表的b2字段中不存在,所以查询结果返回a表中除该行之外的所有行
------解决方案--------------------
SQL解析时,会针对exists中的条件与table中的每一笔记录做检查