0

我有一个类似于以下的查询,

select * from T1 where abc in (select distinct abc from T2);

场景是表 T2 中没有名为 abc 的字段,因此内部查询无效,但整个查询仍然返回输出。

这种行为的原因是什么?

4

2 回答 2

2

如果 中没有列,则子查询abct2的对 的引用abc将通过在 中查找列来abc解决t1。所以查询最终是

select * 
  from T1 
 where t1.abc in (select distinct t1.abc 
                    from T2);

这总是正确的(假设T2至少有 1 行并且t1.abc不为 NULL。

这是您应该始终限定列引用的众多原因之一。这样,您将收到语法错误,而不是意外引用不同的表。

于 2012-10-23T09:46:26.990 回答
0

来自 T1 的 abc 对子查询可见,并且可以在表 T2 上的任何表达式中列出。

因此对于 T2 中的每一行,将返回 T1 中当前行的 abc 值。

因为你有不同的,子选择将只返回一行。

因此,实际上“abc in (abc)”将始终为真,因此您已经有效地编写了

select * from T1;
于 2012-10-23T09:45:14.043 回答