我在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
如何解决这个问题..
答案 0 :(得分:4)
以逗号分隔的表达式列表不能超过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的内容更适合。
答案 1 :(得分:1)
您可以拥有10个1000个项目的列表,而不是1个10000个项目的列表。
WHERE some_column IN (1,2,...,1000)
OR some_column IN (1001,1002,...2000) -- etc.
答案 2 :(得分:0)
不是C#家伙,但我只是将列表listRetID
拆分为多个列表或创建list of lists
然后遍历该列表列表并对列表的每个元素执行查询。
答案 3 :(得分:0)
您的查询意图是什么?
看起来您正在选择某些列等于某个查询的某个记录的第3列的行。
执行此操作的正确方法是SQL连接或子查询。绝对没有必要将它带入C#代码。例如,使用子查询可以编写如下内容:
SELECT *
FROM atable
WHERE afield IN (
SELECT field3
FROM someothertable)