Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更改为加入,以在1000个限制附近工作_Sql_Oracle - Fatal编程技术网

Sql 更改为加入,以在1000个限制附近工作

Sql 更改为加入,以在1000个限制附近工作,sql,oracle,Sql,Oracle,我有一个oracle查询来删除子表中的行,但是查询不起作用,因为in子句中的值太多。有没有其他方法可以通过使用join或其他方法来编写它 delete from PROCESS where PACKAGE_ID in (select id from PACKAGE where NAME like 'Test%'); 在内部选择中使用了*而不是id,因此当我切换到id时,它工作了。但我仍然很好奇这是否可以用不同的方式编写,因为in子句中的中有1000个(?)项的限制。您可以尝试通过添加组 d

我有一个oracle查询来删除子表中的行,但是查询不起作用,因为
in
子句中的值太多。有没有其他方法可以通过使用
join
或其他方法来编写它

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


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

您可以尝试通过
添加

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

您可以尝试通过

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

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


我认为你现在的方式就是前进的方向。

只有当你“手动”指定它们时,
中的
中1000个项目的限制才适用。当项目由子查询返回时,它不适用

我认为你现在拥有的方式是前进的方向

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

这将不起作用,因为它选择所有列,而您只需要一列。 如果展开
*
,您会得到如下类似的结果,这毫无意义:

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

但我仍然很好奇这是否可以用另一种方式写,因为in子句中有1000(?)个项目的限制

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

列表中的项目有一个限制(可能1000):

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

这将不起作用,因为它选择所有列,而您只需要一列。 如果展开
*
,您会得到如下类似的结果,这毫无意义:

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

但我仍然很好奇这是否可以用另一种方式写,因为in子句中有1000(?)个项目的限制

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

列表中的项目有一个限制(可能1000):

(PACKAGE.id,PACKAGE.NAME)
上的索引将非常有助于加快子查询的速度



(PACKAGE.id,PACKAGE.NAME)
上建立索引将非常有助于加快子查询的速度。

由于值太多,为什么这样做不起作用?这到底是怎么回事?太慢了?错误?嗯,它不起作用是因为我错误地使用了
*
而不是
id
。显然,我从Oracle得到的“太多值”错误真的应该是“太多列”。但是,由于我在使用代码创建的查询(没有子选择,只有一堆ID)时遇到了“太多的值”,所以我认为我在这里也会达到这个限制,所以我想知道是否有其他选择。但是,正如其他人所说,子选择不存在此限制,因此问题已经解决:)为什么因为值太多而不起作用?这到底是怎么回事?太慢了?错误?嗯,它不起作用是因为我错误地使用了
*
而不是
id
。显然,我从Oracle得到的“太多值”错误真的应该是“太多列”。但是,由于我在使用代码创建的查询(没有子选择,只有一堆ID)时遇到了“太多的值”,所以我认为我在这里也会达到这个限制,所以我想知道是否有其他选择。但是,正如其他人所说,子选择不存在此限制,因此问题就不存在了:)这相当于从名为“Test%”的包中选择不同的id,我非常怀疑这是否有区别(Oracle应该已经对其进行了分组,而且
id
听起来似乎是唯一的)。我本来打算建议使用
DISTINCT
,但我知道这并不是所有类型的SQL都可以使用的(我不熟悉Oracle),所以我认为分组方式是一个安全的建议。是的,id已经是唯一的,所以分组或不一致不会有任何帮助。这相当于从名称为“Test%”的包中选择不一致的id。我非常怀疑这会有什么不同(Oracle应该已经对其进行分组,而且
id
听起来似乎是唯一的)。我本来打算建议使用
DISTINCT
,但我知道这并不是所有类型的SQL都可以使用的(我不熟悉Oracle),所以我认为GROUP BY是一个安全的建议。是的,id已经是唯一的,所以分组或DISTINCT不会有任何帮助。在(Package.Name,Package.id)上添加索引会更有帮助。前缀范围扫描和所有…@Thilo无论是从索引中首先提取
NAME
还是
ID
,两者都应该是等效的(IMHO)。@Tomalek:否。我们希望选择所有ID,按名称范围过滤。如果我们有一个以名称开头的索引,我们就会得到一个范围扫描访问路径。反过来说,我们必须扫描整个索引。@Thilo为什么在ID固定的情况下它会扫描整个索引?(我不是想证明你错了,我真的很感兴趣)这个问题类似于“给我所有叫史密斯的人的电话号码”。您希望索引按名称排序,而不是按数字排序。在(Package.name,Package.id)上的索引更有用。前缀范围扫描和所有…@Thilo无论是从索引中首先提取
NAME
还是
ID
,两者都应该是等效的(IMHO)。@Tomalek:否。我们希望选择所有ID,按名称范围过滤。如果我们有一个以名称开头的索引,我们就会得到一个范围扫描访问路径。反过来说,我们必须扫描整个索引。@Thilo为什么在ID固定的情况下它会扫描整个索引?(我不是想证明你错了,我真的很感兴趣)这个问题类似于“给我所有叫史密斯的人的电话号码”。你希望索引按名称排序,而不是按数字排序。哦,真的吗?太好了!