SQL EXISTS子查询逻辑疑问:无关联条件返回全表数据的原因
SQL执行逻辑说明
你写的SQL返回全表数据的核心原因是EXISTS子查询未和外层表建立关联条件,具体执行规则如下:
- EXISTS运算符的判断逻辑非常简单:仅校验后续子查询是否存在返回结果,只要子查询能返回至少1行数据,EXISTS返回值就为
TRUE,反之返回FALSE,不关心子查询返回的具体内容是什么。 - 你编写的
select * from neworders where exists(select orderId from orders);中的子查询属于非关联子查询,执行时不会依赖外层neworders表的任何字段值。由于你的orders表本身存在6条有效数据,所以无论外层遍历neworders的哪一行数据,该子查询永远能返回结果,WHERE条件永远成立,最终就会返回neworders的全部6行记录,不会过滤orderId=7的行。
如果你的需求是筛选出neworders中orderId在orders表中也存在的记录,需要编写关联EXISTS子查询,正确写法如下:
select * from neworders n where exists( select 1 from orders o where o.orderId = n.orderId );
该写法的执行逻辑为:遍历neworders的每一行时,会将当前行的orderId代入子查询,到orders表中匹配相同orderId的记录,匹配成功EXISTS才返回TRUE,最终会过滤掉orderId=7的行,仅返回符合匹配条件的5条记录。
内容的提问来源于stack exchange,提问作者Aida Arisa
相关产品推荐
相关产品推荐

