[英]cannot update oracle sql table
have this code:有这个代码:
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;
but whe i try to run it i got an error: ORA-01779: cannot modify a column which maps to a non key-preserved table但是当我尝试运行它时出现错误:ORA-01779:无法修改映射到非键保留表的列
i googled, but didnt understand how to fix it.我用谷歌搜索,但不明白如何解决它。 What`s the problem?
有什么问题?
You should be able to put your query into a MERGE
statement (correlating on the ROWID
pseudo-column):您应该能够将查询放入
MERGE
语句(与ROWID
伪列相关):
MERGE INTO medicine_instances dst
USING (
select mi.ROWID AS rid
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)
) src
ON ( src.rid = dst.ROWID )
WHEN MATCHED THEN
UPDATE SET medicine_price = src.medicine_price * 0.98;
You can use corelation as follows:您可以按如下方式使用关联:
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 )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.