Oracle 子查询的乐趣
Oracle subquery funniness
想象一个查询
SELECT Col_A FROM TABLE_A WHERE Col_A IN (SELECT Col_A FROM TABLE_B)
除此之外,TABLE_B 没有 Col_A 列;只有 TABLE_A 有。我在 Oracle 12 中尝试过这个,我不确定它的版本有多远,但看起来 returns 显示来自 TABLE_A 的所有 Col_A 数据的有效结果。作为一名开发人员,我期待这样的事情会引发错误,因为可以这么说,内部查询甚至不会再次访问 TABLE_A 。有人可以解释为什么或在哪里我们会使用像上面那样的查询情况,因为我几乎觉得它应该是系统中的一个错误。
这不是错误。由于您没有限定该列,Oracle 将其解释为 table A 中的当前列值——在范围内(参见 a correlative sub query)。因此,子查询只生成与 table B.
中的行一样多的该列值的重复项
in
条件将基于此变为真或假。当 table B 为空时,它将始终为 false。在 Col_A
为空的情况下,它也将为假。但在所有其他情况下都是如此。因此,您将获得与 table A 中具有 Col_A
中的 non-null 值的行一样多的结果,除非 table B 为空,在这种情况下,您没有结果。
想象一个查询
SELECT Col_A FROM TABLE_A WHERE Col_A IN (SELECT Col_A FROM TABLE_B)
除此之外,TABLE_B 没有 Col_A 列;只有 TABLE_A 有。我在 Oracle 12 中尝试过这个,我不确定它的版本有多远,但看起来 returns 显示来自 TABLE_A 的所有 Col_A 数据的有效结果。作为一名开发人员,我期待这样的事情会引发错误,因为可以这么说,内部查询甚至不会再次访问 TABLE_A 。有人可以解释为什么或在哪里我们会使用像上面那样的查询情况,因为我几乎觉得它应该是系统中的一个错误。
这不是错误。由于您没有限定该列,Oracle 将其解释为 table A 中的当前列值——在范围内(参见 a correlative sub query)。因此,子查询只生成与 table B.
中的行一样多的该列值的重复项in
条件将基于此变为真或假。当 table B 为空时,它将始终为 false。在 Col_A
为空的情况下,它也将为假。但在所有其他情况下都是如此。因此,您将获得与 table A 中具有 Col_A
中的 non-null 值的行一样多的结果,除非 table B 为空,在这种情况下,您没有结果。