目标重复的Oracle更新

时间:2014-02-20 10:37:07

标签: oracle

假设我有以下表格

目标表

   sales
   ID      ItemNum     DiscAmt    OrigAmt
   1       123         20.00      NULL
   2       456         30.00      NULL
   3       123         20.00      NULL

来源表

   prices 
   ItemNum      OrigAmt
   123          25.00
   456          35.00

我尝试使用

在源表中使用OrigAmt更新目标表中的OrigAmt
  UPDATE
  (   SELECT    s.OrigAmt dests
          ,p.OrigAmt srcs            
      FROM      sales s
      LEFT JOIN prices p
      ON        s.ItemNum = p.ItemNum
   ) amnts
   SET amnts.dests = amnts.srcs
   ;

但是我得到:ORA-01779:无法修改映射到非密钥保留表的列 我也尝试使用合并但我得到:ORA-30926:无法在源表中获得稳定的行集

1 个答案:

答案 0 :(得分:0)

通常不能更新任意SELECT的结果。

单一陈述,假设ItemNum是价格的主键:

 UPDATE sales WHERE (SELECT count(price.ItemNum) FROM price 
     WHERE price.ItemNum = sales.ItemNum) > 0
 SET OrigAmt = 
     (SELECT MAX(OrigAmt) FROM price 
     WHERE price.ItemNum = sales.ItemNum) 

您可以省略WHERE和/或MAX。

较少复杂:将光标悬停在

 SELECT ItemNum, OrigAmt FROM price 

从表格价格中为每个ItemNum执行多项更新:

 UPDATE sales SET OrigAmt=? WHERE ItemNum=?