为何子查询可引用主查询列?该SQL语句含义解析
该SQL子查询的疑问解答
为什么查询不报错?
这是因为SQL的列名解析规则:当子查询中引用的列在当前查询的表(这里是sub_table)中不存在时,会自动向上查找外层查询的表(这里是maintable)中的同名列。你写的子查询里的a_main,实际上是引用了外层maintable的a_main列,而非sub_table的列,所以语法完全合法,不会触发报错。
这个子查询的实际含义
这个查询的逻辑和直观理解的不一样,实际效果是:
- 如果
sub_table表不为空(哪怕只有一行数据),maintable里的所有行都会被查出来。因为子查询会返回和sub_table行数相同的、当前外层行的a_main值,所以a_main IN (...)的条件永远成立。 - 如果
sub_table表是空表,子查询返回空结果,a_main IN (...)条件不成立,maintable里不会返回任何行。
简单说,这个查询等价于:
SELECT * FROM maintable WHERE EXISTS (SELECT 1 FROM sub_table)
内容的提问来源于stack exchange,提问作者coutier eric
相关产品推荐
相关产品推荐

