繁体   English   中英

无法更新 oracle sql 表

[英]cannot update oracle sql table

有这个代码:

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:无法修改映射到非键保留表的列

我用谷歌搜索,但不明白如何解决它。 有什么问题?

您应该能够将查询放入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;

您可以按如下方式使用关联:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM