【问题标题】:Oracle Error : Maximum number of expressions in a list is 1000Oracle 错误:列表中的最大表达式数为 1000
【发布时间】:2012-07-19 11:59:31
【问题描述】:

我在 C#.Net 和 Oracle 工作。我正在将字符串传递给查询。我曾使用此代码连接所有项目 ID

List<string> listRetID = new List<string>();
                foreach (DataRow row in dtNew.Rows)
                {
                    listRetID.Add(row[3].ToString());
                }

此连接数超过 10,000。所以我收到这样的错误消息..

ORA-01795: maximum number of expressions in a list is 1000

如何解决这个问题..

【问题讨论】:

  • 请发布由此产生的oracle查询
  • 不,我不能......这是一个非常大的查询。正如我所说,该查询的输入包含一个字符串 [该字符串的 concat 数据跨越 10000 个 id,由逗号分隔]
  • 然后重组您的查询,因为我认为添加 10000 个 id(s) 以形成一个字符串不是一个好主意
  • 这就是我要问的,如何拆分该字符串...

标签: oracle c#-4.0 oracle11g


【解决方案1】:

documentation 声明:

以逗号分隔的表达式列表最多可以包含 1000 个 表达式。逗号分隔的表达式集列表可以包含 任意数量的集合,但每个集合不能超过 1000 表达式。

大概你正在使用这个字符串作为IN (...) 限制的内容,在这种情况下,你真的无能为力——这根本行不通。解决此问题的一种常见方法是生成一个虚拟表作为子查询或公用表表达式 (CTE) 并加入该表,但我不确定您将如何翻译您的列表 - 可能类似于您正在做的任何事情使用您的 IN 子句。您最终希望查询看起来像:

with tmp_tab as (
    select <val1 from list> as val from dual
    union all select <val2 from list from dual
    union all select <val3 from list from dual
    ...
)
select <something>
from <your table> yt
join tmp_tab tt on yt.<field> = tt.val

但这需要在每次运行时生成包括 CTE 在内的整个(巨大)查询,并且没有机会使用绑定变量。

您可能会发现像this approach 这样的东西更可口。

【讨论】:

  • 这很清楚。您必须在 ID 批次最多为 1000 个 ID 的多个查询中执行此操作,然后以一种或另一种方式将结果粘在一起。
【解决方案2】:

您可以拥有 10 个 1000 项的列表,而不是 1 个 10000 项的列表。

WHERE some_column IN (1,2,...,1000)
   OR some_column IN (1001,1002,...2000) -- etc.

【讨论】:

  • 我怎样才能从 10000 个 id 的列表中取出 1000 个 id ......这些值不是硬编码的。都是动态的。
  • 对不起,我不能给你 C# 代码 :( 也许你可以使用 List 的列表并在 1000 个值之后切换到新元素。
【解决方案3】:

不是 C# 人,但我只会将列表 listRetID 拆分为多个列表或创建一个 list of lists

然后遍历该列表列表并对列表的每个元素执行查询。

【讨论】:

    【解决方案4】:

    您查询的目的是什么?

    看起来您选择的行的某些列等于某个查询的记录之一的第 3 列。

    执行此操作的正确方法是 SQL 连接或子查询。绝对没有必要将它带入 C# 代码。例如,使用子查询,您可以编写如下内容:

    SELECT *
    FROM atable
    WHERE afield IN (
        SELECT field3
        FROM someothertable)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-15
      • 2015-05-29
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多