2014-02-20 61 views
0

假設我有以下各表甲骨文更新如果目標存在重複

目標表

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:無法在源表中獲得一組穩定的行

+0

是您的源表'ItemNum'獨特之處? – Ben

+0

是的,它是獨一無二的,抱歉錯過了 – waine

回答

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=?