如题,现有两个表:
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,项目比较急,请高手帮忙哈,谢谢!
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,项目比较急,请高手帮忙哈,谢谢!
解决方案 »
- 这个问题你知道的--进来看看
- 本地计算机 上的 OracleOraDb11g_home1TNSListener 服务启动后停止。
- oracle10.2.0通过透明网关10.2连接sqlserver2005问题,死活不通,高手请拔刀相助!!!
- Enterprise Manager Console 连接数据库自动消失了。。。
- 9I数据库迁移到10G后同样的查询语句为什么执行时间变慢了很多。
- sql 分类统计
- 学习hadoop之前,最好先学哪些课程
- 急求!oracle安装问题
- 那里有Personal Oracle 8i for NT可以下载!急需!
- 求大神帮我看看这个存储过程?
- Oracle sql语句如何写
- 同样的SQL语句,为什么效率差别这么大?
为什么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 命令未正确结束
这个语句也是报和上面同样的错误(逗号处错误),难道delete不支持这种语法?
http://115.com/file/bhujjio7
可以把这两个表连接,建一个视图,然后delete 视图。有个条件,连接字段中至少要有一个表有唯一约束。这也不是个好主意,oracle会删除连接字段没有唯一约束的那个表的相关数据,如果两个字段都有唯一约束,则删除其中一个表的相关数据我觉得你这里应该不是要将两个表中重复的记录都删除吧,如果只要删除test1中的重复记录,delete from test1 where exists(select 1 from test2 where test2.xxx=test1.xxx);
就行了
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表更新为你要的表名就行了。
方法应该没问题,但是我的Test1表里面可能有上千万条记录,并且要定期(可能3~5分钟)去删除一次和Test2中字段值相同的记录。
用这种方法,效率跟不上啊
若相同的数据多的话 用游标删除 order by rowid 的方式
from test11 a, test22 b
where a.a = b.a(+)
and a.b = b.b(+)
and b.a is null;