想象一个查询
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 可以这么说。有人可以解释为什么或在哪里我们会使用上述查询情况,因为我几乎觉得它应该是系统中的一个错误。
最佳答案
这不是一个错误。由于您没有限定该列,Oracle 将其解释为表 A 中的当前列值——在范围内(参见 correlative sub query)。因此,子查询只会生成与表 B 中的行一样多的该列值的重复项。in
条件将基于此变为真或假。当表 B 为空时,它将始终为 false。在 Col_A
的情况下也是假的一片空白。但在所有其他情况下,这将是正确的。因此,您将获得与表 A 中在 Col_A
中具有非空值的行一样多的结果。 ,除非表 B 为空,在这种情况下您不会得到任何结果。
关于sql - Oracle 子查询的趣味性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48936370/