我的查询类似于以下内容,
select * from T1 where abc in (select distinct abc from T2);
场景是表T2中有 NO字段名为abc ,因此内部查询无效,但整个查询仍返回输出。
这种行为的原因是什么?
答案 0 :(得分:2)
如果abc
中没有列t2
,则通过在abc
中查找列abc
来解析子查询中对t1
的引用。所以查询最终成为
select *
from T1
where t1.abc in (select distinct t1.abc
from T2);
始终为true(假设T2
至少有1行且t1.abc
不为NULL。
这是您应该始终限定列引用的众多原因之一。这样,您将获得语法错误,而不是获得对其他表的意外引用。
答案 1 :(得分:0)
abc对子查询可见,并且可以在表T2上的任何表达式中列出。
因此,对于T2中的每一行,将返回T1中当前行的abc值。
因为你有区别,所以subselect只返回一行。
实际上'abc in(abc)'将永远是真的,因此你已经有效地写了
select * from T1;