Sql 如何使用NOT IN子句添加1000多个值
我想在NOT in子句中使用逗号分隔的id。。 我正在使用oracle 11gSql 如何使用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
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-,所以这就是我选择回答的全部问题。即使它们来自数据库之外,它们也可能对应于某个确实属于数据库的领域概念。。。