Oracle IN子句对静态数据的限制为1000,但它接受来自子查询的无限数据。为什么?
答案 0 :(得分:8)
这是对任何expression list的限制:
以逗号分隔的表达式列表最多只能包含1000个表达式。
为何1000?据推测,实现需要某种限制,这似乎绰绰有余。在几十年前设置该限制时,可能存在,或者肯定可能存在限制的性能原因,特别是当优化器将IN
转换为多个OR
语句时case(如果你看一下执行计划,你可以看到)。
我很难想出一个合理的场景,需要靠近它,固定值无法从其他数据中作为子查询得出。
我怀疑它与logical database limits有些相关,例如表示你不能在表中拥有超过1000列;由于在insert语句中使用表达式列表来列出列和要插入的值,因此表达式列表必须能够匹配,但可能没有理由超过它。
当然猜测......如果没有看到软件的内部结构,你就不可能得到明确的答案。
答案 1 :(得分:1)
这是因为IN的性能非常差,列表中有大量值。它只是OR子句的快捷方式,在数据库级别,引擎会将IN更改为OR。
您还应该避免在IN子句中进行子查询 - 更好地使用EXISTS。
答案 2 :(得分:0)
尝试使用'存在'比起'。你也可以使用' exists'来创建子查询。