无法更新oracle sql表

无法更新oracle sql表,sql,oracle,sql-update,Sql,Oracle,Sql Update,有以下代码: select clientinfo.client_surname, mi.medicine_price from clientinfo join orderinfo oi on oi.client_id = clientinfo.client_id join ordered_medicines om on om.order_id = oi.order_id join medicine_instances mi on om.medicine_id_insta

有以下代码:

select clientinfo.client_surname, mi.medicine_price from clientinfo 
    join orderinfo oi on oi.client_id = clientinfo.client_id
    join ordered_medicines om on om.order_id = oi.order_id
    join medicine_instances mi on om.medicine_id_instance = mi.medicine_id_instance
    where add_months(birthdate, 65*12) < CURRENT_DATE and mi.medicine_price in (select max(medicine_price) from medicine_instances);
update
(select mi.medicine_price
from clientinfo 
    join orderinfo oi on oi.client_id = clientinfo.client_id
    join ordered_medicines om on om.order_id = oi.order_id
    join medicine_instances mi on om.medicine_id_instance = mi.medicine_id_instance
    where add_months(birthdate, 65*12) < CURRENT_DATE and mi.medicine_price in (select max(medicine_price) from medicine_instances)
    ) T
    set T.medicine_price = T.medicine_price * 0.98;
但当我尝试运行它时,我遇到了一个错误: ORA-01779:无法修改映射到非键保留表的列


我在谷歌上搜索过,但不知道如何修复它。问题出在哪里?

您应该能够将查询放入与ROWID伪列相关的MERGE语句中:

合并到medicine_实例中 使用 选择mi.ROWID作为rid 来自clientinfo 加入orderinfo oi 在oi.client\u id=clientinfo.client\u id上 加入奥姆 在om.order\U id=oi.order\U id上 加入医学联盟 在om.medicine\u id\u实例=mi.medicine\u id\u实例上 其中添加月份出生日期,65*12<当前日期 以及从medicine_实例中选择maxmedicine_价格中的mi.medicine_价格 src 在src.rid=dst.ROWID上 当匹配时 更新设置药品价格=src.medicine\u price*0.98;
您可以按如下方式使用关联:

Update medicine_instances trg
  Set trg.medicine_price =
(select mi.medicine_price
  from   clientinfo 
         join orderinfo oi on oi.client_id = clientinfo.client_id
         join ordered_medicines om on om.order_id = oi.order_id
         join medicine_instances mi on om.medicine_id_instance = mi.medicine_id_instance
   where add_months(birthdate, 65*12) < CURRENT_DATE
     and mi.medicine_price in (select max(medicine_price) from medicine_instances)
     And mi.medicine_id_instance = trg.medicine_id_instance )
   Where exists
 (select 1
  from   clientinfo 
         join orderinfo oi on oi.client_id = clientinfo.client_id
         join ordered_medicines om on om.order_id = oi.order_id
         join medicine_instances mi on om.medicine_id_instance = mi.medicine_id_instance
   where add_months(birthdate, 65*12) < CURRENT_DATE
     and mi.medicine_price in (select max(medicine_price) from medicine_instances)
     And mi.medicine_id_instance = trg.medicine_id_instance )

我假设您的几个连接是正确的类型-您有连续的查找,并且在每种情况下您都连接到一个查找表,其中连接列是主键。唉,除非您通过约束或索引明确告诉Oracle某些列是主键或唯一的,否则Oracle不会知道这一点,并且它会假设至少可能存在歧义。如果我的假设是正确的,那么解决这个问题的正确方法是显式声明主键或唯一键约束。然后,更新应该按照编写的那样工作。