Oracle 通过以经济高效的方式连接两个表来删除查询

Oracle 通过以经济高效的方式连接两个表来删除查询,oracle,oracle11g,Oracle,Oracle11g,我必须从某个表中删除数据,因此我使用以下查询: delete from table_a where objectname in (Select object_name from table_b where resolved='Y'); 现在,从表_b中选择对象_name,其中resolved='Y'查询将返回超过400万条记录,因此将花费大量时间执行。我正试图以一种更具成本效益的方式来写它 DELETE FROM table_a WHERE EXISTS ( SELECT 1 F

我必须从某个表中删除数据,因此我使用以下查询:

delete from table_a 
where objectname in 
    (Select object_name from table_b where resolved='Y');
现在,从表_b中选择对象_name,其中resolved='Y'查询将返回超过400万条记录,因此将花费大量时间执行。我正试图以一种更具成本效益的方式来写它

DELETE FROM table_a 
WHERE EXISTS ( SELECT 1 FROM table_b WHERE object_name= objectname AND RESOLVED = ‘Y’ )
AND ROWNUM < 10000;
但似乎有错误:


SQL错误:ORA-00911:无效字符00911。00000-无效字符*原因:标识符不能以字母和数字以外的任何ASCII字符开头。$\u也允许在第一个字符后使用。双引号括起的标识符可以包含双引号以外的任何字符。可选引号q“…”不能使用空格、制表符或回车符作为分隔符。对于所有其他上下文,请参阅SQL语言参考手册

请帮忙

假设你有

表_a上的主键 表_b上的外键,它引用表_a,并设置为on DELETE CASCADE或on DELETE set NULL 您可以为此使用内联视图:

create table table_a as (select distinct object_name from all_objects);
alter table table_a add constraint pk_a primary key (object_name);

create table table_b as (
  select 
    distinct object_name, 
    (case when object_name like 'A%' then 'Y' else 'N' end)   as resolved
    from table_a);    
alter table table_b add constraint fk_b_a foreign key (object_name) 
  references table_a(object_name) on delete cascade;

delete from (
  select b.resolved 
  from table_a a 
  join table_b b on a.object_name = b.object_name)
where resolved = 'Y';

但老实说,EXISTS/IN方法更清晰、更容易理解。

似乎在出错,您到底得到了什么错误?SQL错误:ORA-00911:无效字符00911。00000-无效字符*原因:标识符不能以字母和数字以外的任何ASCII字符开头。$\u也允许在第一个字符后使用。双引号括起的标识符可以包含双引号以外的任何字符。可选引号q“…”不能使用空格、制表符或回车符作为分隔符。对于所有其他上下文,请参阅SQL语言参考手册。可能是因为有趣的引号:“Y”。在第一个示例中尝试使用“Y”。是的,这似乎可行,但原始查询和新查询的成本完全相同。有没有更好的方法来编写这个删除查询。这两个查询对我来说都很好,但我更喜欢EXISTS版本而不是IN版本。如果您将表b的设计包括在内,那么这两个表的现有索引会更好。从存在的表A中删除,从表b中选择对象名称,其中对象名称=对象名称,已解析='Y',ROWNUM<10000;我必须删除表A中超过400万条记录,因此每次运行此查询时,结果集将限制为删除10K条记录。对吗?