Sql 更改为加入,以在1000个限制附近工作
我有一个oracle查询来删除子表中的行,但是查询不起作用,因为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
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固定的情况下它会扫描整个索引?(我不是想证明你错了,我真的很感兴趣)这个问题类似于“给我所有叫史密斯的人的电话号码”。你希望索引按名称排序,而不是按数字排序。哦,真的吗?太好了!