查询(“输入”中的更新集)

时间:2019-08-15 16:30:37

标签: database oracle

您能帮我解决这个问题吗?必须进行更新,但错误
出现在Oracle中。我需要用NEW

替换旧数量
Select Results:
PRODUCT   OLD   NEW
12345837          1      0
15198683          2      1

查询更新:

UPDATE
       (SELECT 
      T2.PRODUCT,
      T1.RESERVED_AMT AS OLD,
      T1.RESERVED_AMT-T2.RESERVED AS NEW
      FROM PRODUCT_LOCATION T1
      INNER JOIN Temp_Reservado_Control2 T2
      ON T1.LOCATION_ID=T2.LOCATIONE AND T1.PRODUCT_ID=T2.PRODUCT AND T1.RESERVED_AMT > 0) t
      SET t.OLD = t.NEW
  

SQL错误[1779] [42000]:ORA-01779:无法修改映射的列   到非保留键的表

非常感谢您的帮助和建议。 问候。

1 个答案:

答案 0 :(得分:0)

您可以使用UPDATE进行更新,并可以在SETEXISTS子句中重复子查询。

此外,您可以使用MERGE

-使用更新并存在

UPDATE PRODUCT_LOCATION T1
SET T1.RESERVED_AMT = T1.RESERVED_AMT - 
(SELECT T2.RESERVED 
FROM Temp_Reservado_Control2 T2
WHERE T1.LOCATION_ID=T2.LOCATIONE AND T1.PRODUCT_ID=T2.PRODUCT AND T1.RESERVED_AMT > 0)
WHERE
EXISTS
(SELECT 1
FROM Temp_Reservado_Control2 T12
ON T1.LOCATION_ID=T12.LOCATIONE AND T1.PRODUCT_ID=T12.PRODUCT AND T1.RESERVED_AMT > 0);

-使用MERGE

MERGE INTO PRODUCT_LOCATION T1
USING (SELECT T2.RESERVED, T2.LOCATIONE, T2.PRODUCT 
FROM Temp_Reservado_Control2 T2) T2
ON ( T1.LOCATION_ID=T2.LOCATIONE AND T1.PRODUCT_ID=T2.PRODUCT)
WHEN MATCHED THEN 
UPDATE SET T1.RESERVED_AMT = T1.RESERVED_AMT - T2.RESERVED
WHERE T1.RESERVED_AMT > 0;

注意:如果Temp_Reservado_Control2中有多个匹配记录,则需要在RESERVED列上使用聚合函数。

干杯!