假设我有以下表格
目标表
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 :(得分: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=?