子查询中包含不存在的列--居然不是bug!

1.现象

create table a as
(select 1 as col_a);
create table b as
(select 2 as col_b)

 select *
 from a
 where col_a in (select col_a from b)

其中,col_a只存在于table_a中,table_b中没有该字段,整条语句的结果是可以成功执行!

2.原因:

这个问题比较困惑,网上搜到的原因是“当子查询中的列名不存在时,自动向外层寻找”。

也就是说,上面的查询实际上被解释成了

select *
 from a
 where col_a in (col_a)

相当于自动屏蔽了子查询的约束条件。

3.修改:

为了避免这种情况发生,需要先保证子查询中的SQL能够正确运行,再查看SQL整体

时间: 2024-11-08 14:09:59

子查询中包含不存在的列--居然不是bug!的相关文章

如何在子查询中实现多列过滤

什么是子查询: 当一个查询是另外一个查询的条件,称之为子查询. 常见子查询使用场景: 1.使用子查询可以避免由于子查询中的数据产生的重复. 2.使用子查询更符合语义,更好理解 -- 子查询user_id 重复时,不会导致结果重复 select user_name from qujing where id in (select user_id from user_kills); -- 使用join时,会重复 select a.user_name from qujing a join user_ki

子查询中的NULL问题

子查询返回有单行,多行和null值:适用于单行子查询的比较运算符是=,>,>=,<,<=<>和!=.适用于多行子查询的比较运算符是in,not in,any和any.在子查询中不可回避的是会返回null值,下面就这个问题来讨论一下. 在单行子查询中 SQL> select last_name,department_id from employees where department_id is null; LAST_NAME DEPARTMENT_ID -----

MyBatis Plus之like模糊查询中包含有特殊字符(_、\、%)

传统的解决思路:自定义一个拦截器,当有模糊查询时,模糊查询的关键字中包含有上述特殊字符时,在该特殊字符前添加\进行转义处理. 新的解决思路:将like 替换为 MySQL内置函数locate函数 一.问题提出 使用MyBatis中的模糊查询时,当查询关键字中包括有_.\.%时,查询关键字失效. 二.问题分析 1.当like中包含_时,查询仍为全部,即 like '%_%'查询出来的结果与like '%%'一致,并不能查询出实际字段中包含有_特殊字符的结果条目2.like中包括%时,与1中相同3.

mysql 子查询中 使用 limit

如果sql语句中的子查询包含limit 例如: select * from a where id in (select id from b limit 3) 会报错:This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME subquery' # 解决办法: 1.加一层子查询 例如:select * from a where id in (select t.id from (select id from b limit

子查询中不能使用limit或者in

select * from  wechat_account_info  where id in(select id from wechat_account_info where groupId ='8' ORDER BY id limit 15  ) as s 此句执行中会出现如下错误: [Err] 1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 原因: MYSQL子查询不支持

oracle子查询中not in后面不能为null值的理解

首先说说oracle中的null值吧. null在oracle中代表未知,表示可能有,也可能没有.任何与null值的普通运算都为null,但可以用一些函数来处理null值,oracle排序中默认null最大. 接着进入正文 这里in后面有null,能返回数据 但加了not后,就不能返回数据了 这里的in后面的句子可以理解为or拼接,即 id in (200,201,null)可以等价于id=200 or id=201or id=null, id not in (200,201,null)可以等价

子查询中可以包含order by 子句--(在from里面)

select a.* from dept a where a.deptno in (select b.deptno from emp b order by b.deptno)  --在where后面报错: ORA-00907: missing right parenthesis ; --from后面的视图是内联视图,可以使用order by --如上报错语句再嵌套一层变成from后面的内联视图就好了 --例如: select a.* from dept a where a.deptno in (

thinkphp3.2.3子查询中遇到的错误

使用buildSql方法 $subQuery = $model->field('id,name')->table('tablename')->group('field')->where($where)->order('status')->buildSql(); $model->table($subQuery.' a')->where()->order()->select(): 当我们把里面的.' a'去掉时运行会出现错误,因为每个派生出来的表(即

Hive学习之Union和子查询

Union的语法格式如下: select_statement UNION ALL select_statement UNION ALL select_statement ... Union用于将多个SELECT语句的查询结果合并到一个结果集中,目前Hive只支持UNION ALL,也就是结果集中的重复记录不会被删除.SELECT语句返回列的数目和名称必须相同,否则会报schema错误.Union语句还可以嵌套在FROM子句中: SELECT * FROM ( select_statement U