delete from (
select u.nbr from user_info u left outer join call c on u.nbr=c.calling_nbr and u.nbr=c.called_nbr)x
select u.nbr from user_info u left outer join call c on u.nbr=c.calling_nbr and u.nbr=c.called_nbr)x
解决方案 »
- 如何使用sqlloader导入xml文件到Oracle数据库?
- 一年1T的数据容量,数据库设计
- WINDOWS2003安装oracle8i到oracle database configuration assistant一直显示未完成
- 关于多表关联表达式
- 超级并发问题
- oracle中在触发器中实现当向一个表中插入一条记录并成功后得到这条记录怎么写
- oracle 存储过程中分割字符串
- orcale同步问题
- 問個簡單問題:Oracle怎么樣選取前N行數據?
- 有没有办法对Oracle一张表中的某些记录加锁
- 使用to_char函数别名后,使用group by,报错“标识符无效”
- oracle中Long类型转换Blob类型问题
delete /*+ parallel(a,32) */from call a
where exists(select 1
from user_info b
where b.nbr in (a.calling_nbr ,a.called_nbr)
);最好写个存储过程搞,飞快
where exists(
select /*+ parallel(c,32) */ 1
from call c
left outer join (select certi_latn ce,acc_nbr from user_info) u1 on u1.acc_nbr=c.calling_nbr
left outer join (select certi_latn ce,acc_nbr from user_info) u2 on u2.acc_nbr=c.called_nbr
where u1.ce is null and u2.ce is null);执行计划来看要更快,但select count(*)后发现两个条件得到的行数不同,不知道问题出在哪里
要么都删了,要么一条都没删除建议直接写个脚本,给你个模板,表有分区的话,一个分区跑一个很快的declare
v_flag number;
v_cnt number := 0;
begin
for v_cur in (select t.*,rowid row_id from call t) loop
begin
--满足条件的删除 v_flag := -1;
v_cnt := v_cnt + 1;
v_flag := 0;
... if v_flag = 1 then
delete from call when rowid = v_cur.row_id
end if;
exception when others then
null;
end;
if v_cnt > 1000 then
v_cnt := 0;
commit;
end if;
end for;
commit;
end;