3

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

4 回答 4

9

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

在 Oracle 中,查询解析是昂贵的,当您将数千个标识符放入一个巨大的 SQL 块中时,您会得到这样的结果。此外,您要达到的查询长度存在不明确的限制。另一方面,对表执行反联接... Oracle 擅长于此。将数据批量加载到表中,Oracle 也很擅长。使用临时表。

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

于 2012-09-22T00:47:44.490 回答
0

这太疯狂了。

但是您可能可以尝试从 select 中进行选择:

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

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

于 2014-09-18T10:31:07.500 回答
0

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

于 2014-09-01T03:43:59.987 回答
0

使用MINUS,与`UNION相反

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

T这表示表上没有 id 的寄存器table2 t2

于 2019-03-28T14:39:21.073 回答