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

时间:2012-09-22 00:37:13

标签: 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 NOT IN (1001,1002,…,2000)

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

4 个答案:

答案 0 :(得分:9)

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

查询解析在Oracle中很昂贵,而这就是当您将数千个标识符放入一大堆SQL时所获得的内容。此外,您将要查询的查询长度为ill-defined limits。另一方面,对表执行反JOIN ... Oracle擅长这一点。将数据批量加载到表中,Oracle也很擅长。使用临时表。

IN限制为一千个条目是一项完整性检查。你打它的事实意味着你正试图做一些疯狂的事情。

答案 1 :(得分:0)

跳出这个问题,你能否结合使用SQL来获取超过1000个ID。这是简化SQL的更好方法。

答案 2 :(得分:0)

这太疯狂了。

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

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

根据需要制作多个级别。

答案 3 :(得分:0)

使用MINUS,与`UNION

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

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