如题,现有两个表:
create table test1(CardID number, Name NVARCHAR2(20), Sex NUMBER);
create table test2(CardID number, Name NVARCHAR2(20));test1表中有大量数据,可能上千万条,而test2表中当前有数十万条记录。请问各位高手,如何高效地删除test1和test2中CardID及Name相同的记录?使用join连接可以吗,我用以下SQL语句老是报错:
SQL> delete from test1 join test2 on test1.CardID = test2.CardID and test1.Name = test2.Name;
delete from test1 join test2 on test1.CardID = test2.CardID and test1.Name = test2.Name
                  *
第 1 行出现错误:
ORA-00933: SQL 命令未正确结束

难道join连接不支持删除?小弟最近刚刚接触Oracle,项目比较急,请高手帮忙哈,谢谢!

解决方案 »

  1.   

    DELETE TEST1,TEST2 FROM TEST1 LEFT JOIN TEST2 ON TEST1.CARDID = TEST2.CARDID AND TEST1.NAME = TEST2.NAME
      

  2.   

    DELETE TEST1,TEST2 FROM TEST1 ,TEST2 where TEST1.CARDID = TEST2.CARDID AND TEST1.NAME = TEST2.NAME
      

  3.   

    如果是用LeftJoin的话。。那会删除一些不在这个范围的数据。
      

  4.   

    逻辑简单点的方法,用select生成一个有相同记录的新表。然后delete在这个新表里面的就OK了。哈哈
      

  5.   


    为什么SQL Plus报错呢,提示TEST1和TEST2之间的逗号处有错误?
    SQL> DELETE TEST1,TEST2 FROM TEST1 LEFT JOIN TEST2 ON TEST1.CARDID = TEST2.CARDID AND TEST1.NAME = TEST2.NAME;
    DELETE TEST1,TEST2 FROM TEST1 LEFT JOIN TEST2 ON TEST1.CARDID = TEST2.CARDID AND TEST1.NAME = TEST2.
                *
    第 1 行出现错误:
    ORA-00933: SQL 命令未正确结束
      

  6.   


    这个语句也是报和上面同样的错误(逗号处错误),难道delete不支持这种语法?
      

  7.   

    delete 后面可以跟两个表名吗? 貌似不可以吧!
      

  8.   

    你可以写一个存储过程,分两句delete执行
      

  9.   

    图片地址:
    http://115.com/file/bhujjio7
      

  10.   

    delete 后面要跟 你要删除哪些字段数据,他写的test1,test2   你要写成字段名或者*
      

  11.   

    只能再通过一个临时表,否则删除了test1,删除不了test1
      

  12.   

    只能再通过一个临时表,否则删除了test1,删除不了test12
      

  13.   

    记得应该是没有这样的语法
    可以把这两个表连接,建一个视图,然后delete 视图。有个条件,连接字段中至少要有一个表有唯一约束。这也不是个好主意,oracle会删除连接字段没有唯一约束的那个表的相关数据,如果两个字段都有唯一约束,则删除其中一个表的相关数据我觉得你这里应该不是要将两个表中重复的记录都删除吧,如果只要删除test1中的重复记录,delete from test1 where exists(select 1 from test2 where test2.xxx=test1.xxx);
    就行了
      

  14.   

    上面的方法没有一个可以帮你的,可以这样:
    delete from test1 where exists(select 1 from test2 where test2.xxx=test1.xxx);
    insert into test1_tmp as  select  *  from test1  where not exists(select 1 from test2 where test2.xxx=test1.xxx);
    insert into test2_tmp as  select  *  from test2  where not exists(select 1 from test1 where test2.xxx=test1.xxx);
    drop table test1;
    drop table test2;最后把temp表更新为你要的表名就行了。
      

  15.   


    方法应该没问题,但是我的Test1表里面可能有上千万条记录,并且要定期(可能3~5分钟)去删除一次和Test2中字段值相同的记录。
    用这种方法,效率跟不上啊
      

  16.   

    如果相同的数据量少的话,在两个表中的两列上建联合索引 再delete即可,
    若相同的数据多的话 用游标删除 order by rowid 的方式
      

  17.   

    select *
      from test11 a, test22 b
     where a.a = b.a(+)
       and a.b = b.b(+)
       and b.a is null;