MySQL 5.7.16子查询未报未知列错误却返回空结果的原因咨询
MySQL 5.7.16中子查询列解析异常的原因分析
单独执行子查询报错的原因:单独执行
select max(id) from app_log_conf where app_id = 123 and r_status = 1 and r_type = 1时,MySQL仅在app_log_conf表范围内查找字段,由于r_status和r_type列不存在,直接抛出Unknown column错误。嵌套主查询时不报错但返回空的原因:MySQL的字段解析逻辑是:子查询中引用的字段如果在自身关联的表中找不到,会自动向上查找外层查询的表字段。
若rule_conf表中恰好存在r_status和r_type列,子查询里的r_status=1和r_type=1会被解析为外层rule_conf表的字段条件,子查询因此变成隐式相关子查询,实际执行逻辑等价于:select max(id) from app_log_conf where app_id = 123 and rule_conf.r_status = 1 and rule_conf.r_type = 1此时子查询会针对
rule_conf的每一行,去app_log_conf中匹配符合条件的记录。如果没有满足条件的结果,子查询返回NULL,而MySQL中app_log_id = NULL的判断结果永远为假,最终主查询返回空集。添加
aaa=1后报错的原因:aaa列既不在app_log_conf表中,也不在外层的rule_conf表中,MySQL遍历所有可见表都无法找到该字段,因此直接抛出Unknown column 'aaa' in 'where clause'错误。
内容的提问来源于stack exchange,提问作者Richard Shan
相关产品推荐
相关产品推荐

