Oracle SQL中的更新语句给出错误“无法修改Map到非保留键表的列”

yyhrrdl8  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(146)

我有一个SQL查询,运行时给出下面的错误。

SQ Error: ORA-01779: cannot modify a column which maps to a non key-preserved table
01779. 00000 -  "cannot modify a column which maps to a non key-preserved table"
*Cause:    An attempt was made to insert or update columns of a join view which
           map to a non-key-preserved table.
*Action:   Modify the underlying base tables directly.

字符串
下面是我正在运行的查询。它检查某个列,然后只更新列中的静态值。

SQL语句:

UPDATE(
SELECT UMR.*, RMINV.*
 FROM UNMATCHED_RAW_TABLE UMR
 INNER JOIN RMINV_RAWDATA_TEST RMINV
 ON UMR.PHONE_NUMBER = RMINV.ITEM_IDCIRCUITWTN
 WHERE UMR.CARRIER='ABCD'
 AND RMINV.account_num='12345'
 AND (RMINV.CC_CODE IS NULL OR RMINV.DEPARTMENT IS NULL)
)
SET UMR.UNMATCHED_REASONS = 'Missing Department'


让我知道如果我做错了什么。
我已经尝试更新SQL如上所述,但不为我工作。我只想更新“缺少部门”,因为结果来自选择查询。
Sample Data for both the table used in query

bq9c1y66

bq9c1y661#

在Oracle中,可以根据视图更新表。该视图必须为每个更新表行生成一行,以便DBMS知道要在哪个行中查找更新。
使用更新语句,DBMS会告诉您,查询不能保证为每个UMR行生成一个结果行。(而且我对语法有点惊讶;我不认为别名UMR在查询之外是已知的,所以SET umr.unmatched_reasons = ...无论如何都会导致错误。)
毕竟,这里根本不需要连接,因为您要做的只是在满足特定条件的情况下用常量更新表。因此,请在表上编写一条更新语句,提供适当的WHERE子句。使用EXISTSIN在另一个表中查找数据。

UPDATE unmatched_raw_table umr
SET unmatched_reasons = 'Missing Department'
WHERE carrier = 'ABCD'
AND EXISTS
(
  SELECT null
  FROM rminv_rawdata_test rminv
  WHERE rminv.item_idcircuitwtn = umr.phone_number
  AND rminv.account_num = 12345
  AND (rminv.cc_code IS NULL OR rminv.department IS NULL) 
);

字符串
这是转换为普通表更新的更新语句。检查状况。这些是您要更新数据表时的条件吗?如果没有,请根据您的需要进行修改。

相关问题