我有一个oracle查询来删除子表中的行,但由于in
子句中的值太多,查询不起作用。是否有不同的方法可以使用join
或其他东西来使其起作用?
delete from PROCESS
where PACKAGE_ID in (select id from PACKAGE where NAME like 'Test%');
在内部选择中使用了*
代替id
,所以当我切换到id
时,它就有效了。但我仍然很好奇是否可以用不同的方式编写,因为in
子句中有1000(?)项的限制。
答案 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)