Sql 如何使用NOT IN子句添加1000多个值

Sql 如何使用NOT IN子句添加1000多个值,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我想在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 NO

我想在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)

对于这个问题还有其他更好的解决方法吗?

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

在Oracle中,查询解析非常昂贵,当您将数千个标识符放入一个巨大的SQL块中时,您将得到这一点。此外,还有一个查询长度问题,您将要解决。另一方面,对表执行反联接。。。甲骨文擅长于此。Oracle也擅长将数据批量加载到表中。使用临时表


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

跳出这个问题,你能将SQL与此SQL结合起来获得1000多个ID吗。这是简化SQL的更好方法。

这太疯狂了

但您可能可以尝试从选择中选择:

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

根据需要设置尽可能多的级别。

使用
减号
,与“联合”相反

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

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

No..id是不可预测的。这些id的值来自何处?不使用临时表的动机是什么?上述查询的SQL在何处运行?客户端?在存储过程、函数、包中?或者别的什么地方?“你击中它的事实意味着你在试图做一些疯狂的事情。”说得好。我大体上同意你的分析,但我认为临时桌子是错误的解决方案。填充临时表的开销在许多情况下排除了它们。传递一个数组(PL/SQL集合)可能是一个更好的主意。如果您有1000多个值,我觉得它们可能来自数据库中的其他地方-可能是某种查询我怀疑没有一个用户在那里辛勤地输入数字——在这种情况下,针对该查询的反连接可能是一个合理的解决方案。我同意,但我决定不继续这条推理路线。海报上说他有“不可预测的逗号分隔id”;他只是想知道如何在
限制中绕过1000-
,所以这就是我选择回答的全部问题。即使它们来自数据库之外,它们也可能对应于某个确实属于数据库的领域概念。。。