【发布时间】:2011-06-13 19:59:19
【问题描述】:
在 Informix 查询中可以进入 IN 子句的项目数量是否有限制(如 Oracle 中的 1000 项目限制)?
我们有一个“大”(可能是 2000 年)项目编号列表,正在通过网络服务进行选择,因此除了项目列表之外实际上没有任何可用的上下文。
【问题讨论】:
-
我不知道“IN”语句的值数量有限制!.. 我有一个应用程序执行 SELECT * FROM table_1 WHERE col_1 IN (SELECT col_2 FROM table_2 ).. table_2 有超过 500K 行具有唯一 col_2 值,因此“IN”正在评估超过 500K 不同的值!..它有效!..另外,为什么要将 1,000 的值硬编码到“IN”中声明?.. 'IN (1,2,3,4...)' 翻译成 'OR x = 1 OR x = 2... ???
-
@Frank:在以逗号分隔的值列表中写入时,IN 语句中值的数量限制是 SQL 语句的长度。如果处理正整数(开销字符最少),则可以有 10 个单位数(20 个字节)、90 个两位数(270 个字节)、900 个三位数(3,600 个字节)、9000 个四位数(45,000 字节),以及大约 2750 个五位数字,为 SELECT 的其余部分留出一点空间,用于列表中大约 12,750 个不同的整数值。如果您使用占位符,您可以获得大约 32,000 个值。
-
@Frank:在 SELECT ... WHERE x IN(SELECT ...) 构造中,您不会在 SELECT 语句中创建列表,并且没有具体的数量上限条目。但是,优化器可能会尝试将 IN 子查询视为连接条件。
-
@Jonathan:好的,这是今天学到的新东西,虽然我会尝试找到一种方法来避免手动将一长串值输入到“IN”语句中。所以一个“IN” ' 子查询相当于一个 JOIN?.. 我认为它翻译成 'OR, OR, OR...' 对于类似的相关问题,请参阅:stackoverflow.com/questions/6338516/…
-
@Frank:如果您认为 x IN (y) 等效于与包含 y 值的单列表的联接,您将意识到“多列表”表中的行(如果 s) 与其中一行匹配,或者 '(x = y1 OR x = y2 OR ... x = yN)',它将被连接。我以前没有这样想过,但我相信它是准确的。
标签: informix where-clause