我有一个类似于以下的查询,
select * from T1 where abc in (select distinct abc from T2);
场景是表 T2 中没有名为 abc 的字段,因此内部查询无效,但整个查询仍然返回输出。
这种行为的原因是什么?
如果 中没有列,则子查询abc
中t2
的对 的引用abc
将通过在 中查找列来abc
解决t1
。所以查询最终是
select *
from T1
where t1.abc in (select distinct t1.abc
from T2);
这总是正确的(假设T2
至少有 1 行并且t1.abc
不为 NULL。
这是您应该始终限定列引用的众多原因之一。这样,您将收到语法错误,而不是意外引用不同的表。
来自 T1 的 abc 对子查询可见,并且可以在表 T2 上的任何表达式中列出。
因此对于 T2 中的每一行,将返回 T1 中当前行的 abc 值。
因为你有不同的,子选择将只返回一行。
因此,实际上“abc in (abc)”将始终为真,因此您已经有效地编写了
select * from T1;