3

想象一个查询

SELECT Col_A FROM TABLE_A WHERE Col_A IN (SELECT Col_A FROM TABLE_B) 

除了, TABLE_B 没有 Col_A 列;只有 TABLE_A 有它。我在 Oracle 12 中尝试过这个,我不确定它的版本可以追溯到多远,但看起来它返回了显示来自 TABLE_A 的所有 Col_A 数据的有效结果。作为开发人员,我希望这样的事情会引发错误,因为内部查询甚至不会再次访问 TABLE_A 可以这么说。有人能解释一下我们为什么或在哪里使用上述查询情况,因为我几乎觉得它应该是系统中的一个错误。

4

1 回答 1

7

这不是一个错误。由于您没有限定该列,Oracle 将其解释为表 A 中的当前列值——它在范围内(参见相关子查询)。因此,子查询只会产生与表 B 中的行一样多的该列值的重复项。

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

于 2018-02-22T20:17:00.957 回答