【问题标题】:Oracle Update Where Target Has Duplicates目标重复的 Oracle 更新
【发布时间】:2014-02-20 10:37:07
【问题描述】:

假设我有以下表格

目标表

   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:无法在源表中获得一组稳定的行

【问题讨论】:

  • 你的源表在ItemNum上是唯一的吗?
  • 是的,它是独一无二的,很抱歉错过了

标签: oracle


【解决方案1】:

您通常不能更新任意 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=? 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多