带负结果的ORACLE更新
在Oracle 10g中,我想更新下面生成的减号查询的记录:带负结果的ORACLE更新,oracle,plsql,Oracle,Plsql,在Oracle 10g中,我想更新下面生成的减号查询的记录: ( SELECT A,B,C FROM Table1 MINUS SELECT A,B,C FROM Table2 ) 要更新的列不是减号查询的一部分,因为它在两个表中都不存在,所以下面的代码不是选项 UPDATE ( SELECT A,B,C FROM Table1 MINUS SELECT A,B,C FROM Table2 ) SET TABLE1.D = 'TEST' 那么: update tabl
(
SELECT A,B,C FROM Table1
MINUS
SELECT A,B,C FROM Table2
)
要更新的列不是减号查询的一部分,因为它在两个表中都不存在,所以下面的代码不是选项
UPDATE
(
SELECT A,B,C FROM Table1
MINUS
SELECT A,B,C FROM Table2
)
SET TABLE1.D = 'TEST'
那么:
update table1
set d = 'TEST'
where (a,b,c) not in(select a,b,c from table2);
编辑:
由于排序操作,减号的性能通常很差。
如果{a,b,c}
中的任何一个可为空,请尝试以下操作:
update table1 t1
set t1.d = 'TEST'
where not exists(
select 'x'
from table2 t2
where t2.a = t1.a
and t2.b = t1.b
and t2.c = t1.c
);
针对您关于希望使用
减号
子句的评论:
update Table1
set d = 'TEST'
where (a,b,c) in (select a,b,c from Table1 minus select a,b,c from Table2);
这很有效。然而,与负数获得差异的速度相比,它的性能非常差。这两种解决方案都有效。我正在寻找一个使用减号的实现。我已经测试过它比WHERE(a,b,c)not in(选择a,b,c)更快,并且比not exists解决方案更容易实现,用于有很多列的表。到目前为止,我将使用您发布的not in解决方案。explain计划有什么不同?我们的经验是,“不存在”反右连接通常比某种“不在嵌套中”循环快。。。当然,这取决于您的数据…@Joel,在Oracle中,当列为空时,NOT In和NOT EXISTS在执行策略上存在差异。我真的建议你也试试不存在的版本。无论如何,我很乐意帮忙:)