无法更新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不会知道这一点,并且它会假设至少可能存在歧义。如果我的假设是正确的,那么解决这个问题的正确方法是显式声明主键或唯一键约束。然后,更新应该按照编写的那样工作。