想要在特定查询后更新具有数字值的列

时间:2017-03-29 22:28:12

标签: sql oracle oracle10g

所以这是我的第一个问题和第一天。提前谢谢。

我想执行以下查询 -

如果持续时间被违反,则将罚款放在books_return上,否则为零。 持续时间在book_issue中。所以我发现我可以计算return_date和issue_date之间的差异,如果它大于10,那么fine_amount将更新为20;否则将更新为零。但是,我遇到了以下查询语句的问题 -

UPDATE (
    SELECT brt.fine_amount 
    FROM book_return brt, book_issue bi 
    WHERE brt.book_id = bi.book_id 
        AND brt.return_date - bi.issue_date > bi.issue_duration
) SET fine_amount = 20;
error - ORA-01779: cannot modify a column which maps to a non key-preserved table

如何启动此查询?

编辑:book_id和borrower_id是两个表的复合主键。

相关表格 -

enter image description here

1 个答案:

答案 0 :(得分:0)

您可以使用merge执行所需操作。如果您使用update,则可以使用exists

UPDATE book_return brt
    SET fine_amount = 20
    WHERE EXISTS (SELECT 1
                  FROM book_issue bi 
                  WHERE brt.book_id = bi.book_id AND
                        brt.return_date - bi.issue_date > bi.issue_duration
                 );