查询说明

时间:2012-10-23 09:41:26

标签: sql oracle11g

我的查询类似于以下内容,

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

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

这种行为的原因是什么?

2 个答案:

答案 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)

来自T1的

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

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

因为你有区别,所以subselect只返回一行。

实际上'abc in(abc)'将永远是真的,因此你已经有效地写了

select * from T1;