sql - Oracle 子查询的趣味性

标签 sql oracle in-subquery

想象一个查询

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/

相关文章:

java - 如何判断数据库中的表是否存在?

sql - oracle sql regexp_replace

SQL主键: integer vs varchar

sql - 在Hive中使用CASE作为联接条件

oracle - 如何在 JSON_ARRAYAGG 中返回不同的值

mysql - 如何从更多表中选择唯一的最小值

mysql - 显示多于一行的键的所有行

mysql - 这个函数是否符合 ANSI SQL 标准?

mysql - 使用mysql中的datediff函数分配sql查询结果进行比较