另一个问题的answer是使用此SQL查询:
SELECT o.Id, o.attrib1, o.attrib2
FROM table1 o
JOIN (SELECT DISTINCT Id
FROM table1, table2, table3
WHERE ...) T1 ON o.id = T1.Id
现在我想知道如何将此语句与关键字FOR UPDATE
一起使用。如果我只是将其附加到查询中,Oracle会告诉我:
ORA-02014:无法从视图中选择FOR UPDATE
我是否必须修改查询或者是否有使用Oracle执行此操作的技巧? 使用MySql,语句可以正常工作。
答案 0 :(得分:4)
尝试:
select .....
from <choose your table>
where id in (<your join query here>) for UPDATE;
编辑:这可能看起来有点违反直觉,考虑到您所关联的问题(询问如何免除IN
),但如果你的话可能仍然有益处join返回一个受限制的集合。但是,没有解决方法:oracle异常非常明显;由于DISTINCT
,oracle不知道要锁定哪些行。您可以省略DISTINCT
或定义视图中的所有内容,然后根据需要更新,而不显式锁定:http://www.dba-oracle.com/t_ora_02014_cannot_select_for_update.htm
答案 1 :(得分:0)
这可能取决于您想要更新的内容。你可以做
... FOR UPDATE OF o.attrib1
告诉它你只对从主表更新数据感兴趣,这似乎是这种情况;这意味着它只会尝试锁定该表,而不用担心连接中的隐式视图。 (并且您仍然可以更新该表中的多个列,命名一个仍然会锁定整行 - 但如果您在FOR UPDATE OF
子句中指定要更新的所有列,则会更清楚。)
不知道这是否适用于MySQL,这让我们回到Mark Byers的观点。