帮助中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中的每一笔记录做检查