如何使用 NOT IN 子句添加超过 1000 个值

Posted

技术标签:

【中文标题】如何使用 NOT IN 子句添加超过 1000 个值【英文标题】:how to add more than 1000 values with NOT IN clause 【发布时间】:2012-09-22 00:37:12 【问题描述】:

我想在 NOT IN 子句中使用逗号分隔的 id。 我正在使用oracle 11g。

select * from table where ID NOT IN (1,2,3,4,...,1001,1002,...)

结果

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

我不想使用临时表。我正在考虑这样做

select * from table1 where ID NOT IN (1,2,3,4,…,1000) AND 
ID NOT IN (1001,1002,…,2000)

还有其他更好的解决方法吗?

【问题讨论】:

No..id 是不可预测的。 这些 ID 的值从何而来? 不使用临时表的动机是什么? 上述查询的 SQL 在哪里?客户端?在存储过程、函数、包中?还是别的地方? 【参考方案1】:

你说你不想,但是:使用临时表。这是正确的解决方案。

在 Oracle 中,查询解析的成本很高,当您将数千个标识符放入一个巨大的 SQL 块中时,您就会得到这样的结果。此外,还有ill-defined limits 的查询长度是您要达到的。另一方面,对表执行反联接... Oracle 擅长于此。将数据批量加载到表中,Oracle 也很擅长。使用临时表。

IN 限制为一千个条目是一种健全性检查。你击中它的事实意味着你正在尝试做一些疯狂的事情。

【讨论】:

“你击中它的事实意味着你正在尝试做一些疯狂的事情。”说得好。 我基本同意您的分析,但我认为临时表是错误的解决方案。填充临时表的开销将它们排除在许多情况下。传递一个数组——一个 PL/SQL 集合——可能是一个更好的主意。 如果您有超过 1000 个值,在我看来它们可能来自您数据库中的其他地方——也许是某种查询? - 我怀疑那里没有用户勤奋地输入数字 - 在这种情况下,针对该查询的反连接可能是一个合理的解决方案。 我同意,但我决定不采用这种推理方式。发帖人说他有“不可预测的”“逗号分隔的 id”;他只是想知道如何绕过 1000-IN 限制,所以这就是我选择回答的全部内容。即使它们来自数据库外部,它们也可能对应于某些确实属于数据库的域概念...【参考方案2】:

跳出问题,你能不能用这个SQL结合SQL得到1000多个ID。这是简化 SQL 的更好方法。

【讨论】:

【参考方案3】:

这太疯狂了。

但你或许可以尝试从 select 中选择:

SELECT * FROM
  (SELECT * FROM table WHERE ID NOT IN (1,2,3,4,...,1000))
WHERE ID NOT IN (1001,1002,…,2000)

根据需要制作尽可能多的关卡。

【讨论】:

【参考方案4】:

使用MINUS,与`UNION相反

SELECT * FROM TABLE
MINUS 
SELECT T.* FROM TABLE T,TABLE2 T2 WHERE T.ID = T2.ID

这表示表 T 上的寄存器,其 ID 不在 table2 t2

【讨论】:

以上是关于如何使用 NOT IN 子句添加超过 1000 个值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?