Oracle子查询有趣

use*_*871 3 sql oracle in-subquery

想象一下查询

SELECT Col_A FROM TABLE_A WHERE Col_A IN (SELECT Col_A FROM TABLE_B) 
Run Code Online (Sandbox Code Playgroud)

除此之外,TABLE_B没有Col_A列; 只有TABLE_A拥有它.我在Oracle 12中尝试了这个,我不确定它的版本有多远,但它看起来像是返回显示TABLE_A中所有Col_A数据的有效结果.作为开发人员,我期待这样的事情抛出一个错误,因为内部查询甚至不能再次访问TABLE_A.有人可以解释为什么或在哪里我们会使用像上面那样的查询情况,因为我几乎觉得它应该是系统中的错误.

tri*_*cot 7

这不是一个bug.由于您没有对列进行限定,因此Oracle将其解释为表A中的当前列值 - 这是在范围内(参见相关子查询).因此,子查询只生成该列值的重复数,因为表B中有行.

基于此in条件将成为真或假.当表B为空时,它总是错误的.在Col_Anull为空的情况下也是错误的.但在所有其他情况下都是如此.因此,您将获得与表A中具有非空值的行一样多的结果Col_A,除非表B为空,在这种情况下您将得不到任何结果.