我想在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)
这个问题还有其他更好的解决方法吗?
答案 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