带负结果的ORACLE更新

带负结果的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

在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 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在执行策略上存在差异。我真的建议你也试试不存在的版本。无论如何,我很乐意帮忙:)