in子查询不能识别不存在的列并导致执行计划错误

【TiDB 版本】 5.0.2
【问题】 维护人员的SQL中使用in子查询,in子查询中的表where条件使用了不存在的列(attr_code),能够正常执行,执行计划中外表走了全表扫描+APPLY. 单独执行in中的子查询则会报列不存在。 将In子查询中的错误条件去除后执行计划算是正常走的hash join,外表也用了索引。2个表都通过主键列访问。具体过程见附件
【附件】
执行测试.txt (17.5 KB)

能否麻烦发一下建表语句,我们在测试环境复现排查下,多谢。

create.txt (2.9 KB)
见附件

当一个列在子查询内不存在,但是在子查询外部的查询出现时,这个 SQL 也是合法可执行的。这个时候叫做关联子查询或者相关子查询(correlated subquery)。https://baike.baidu.com/item/关联子查询/843778

1 个赞

mysql> explain analyze SELECT
-> *
-> FROM
-> d_users.tf_f_user_item_shift
-> WHERE
-> end_date > NOW()
-> AND user_id IN (
-> SELECT
-> user_id
-> FROM
-> d_users.tf_f_user
-> WHERE
-> remove_tag = ‘0’
-> AND attr_code = ‘IS_UDM_USER’
-> AND serial_number IN (
-> ‘156047533’,
-> ‘131711197’,
-> ‘132459688’
-> )
-> );

attr_code 是 d_users.tf_f_user_item_shift 的一个列,所以子查询中没找到,会到外部去找,这里会变成关联子查询,所以能查询是预期的

好的感谢,我测了下mysql oracle确实也是这样 执行计划也是先外表全表扫描,这个特性叫什么,从逻辑上看感觉这样处理不对呢,因为不存在的列从语法语义上就是不对

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。