使用JOIN更改IN以限制1000

时间:2012-02-03 10:00:48

标签: sql oracle

我有一个oracle查询来删除子表中的行,但由于in子句中的值太多,查询不起作用。是否有不同的方法可以使用join或其他东西来使其起作用?

delete from PROCESS 
where PACKAGE_ID in (select id from PACKAGE where NAME like 'Test%');

在内部选择中使用了*代替id,所以当我切换到id时,它就有效了。但我仍然很好奇是否可以用不同的方式编写,因为in子句中有1000(?)项的限制。

4 个答案:

答案 0 :(得分:2)

IN子句中的1000个项的限制仅适用于“手动”指定它们。当子查询返回项目时,它不适用。

我认为你现在拥有它的方式就是你要走的路。

答案 1 :(得分:2)

delete from 
  PROCESS 
where 
  exists(select 1 from PACKAGE where NAME like 'Test%' and id = PROCESS.id);

(PACKAGE.id, PACKAGE.NAME)以上的索引对于加快子查询非常有用。

答案 2 :(得分:0)

您可以尝试添加GROUP BY

delete from PROCESS 
where PACKAGE_ID in (select id from PACKAGE where NAME like 'Test%' GROUP BY id);

答案 3 :(得分:0)

  

在内部选择中使用了*而不是id,所以当我切换到id时它起作用了。

这不起作用,因为它选择所有列,而你只需要一个。 如果你展开*,你会得到类似下面的内容,这是没有意义的:

where PACKAGE_ID in (select id, something, foo, name from PACKAGE);

  

但是我仍然很好奇是否可以用不同的方式编写,因为in子句中有1000(?)项的限制。

子选择没有这样的限制。实际上,这应该是编写此查询的最佳方式。

IN 列表中有一个限制(可能是1000)

where id in (1,2,3,4,5)