1

另一个 SO 问题的答案是使用这个 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,该语句可以正常工作。

4

2 回答 2

4

尝试:

select ..... 
from <choose your table>
where id in (<your join query here>) for UPDATE;

编辑:考虑到您链接到的问题(询问如何免除 ),这似乎有点违反直觉IN,但如果您的加入返回受限集,仍然可能会带来好处。但是,没有解决方法:oracle 异常是不言自明的;oracle 不知道要锁定哪些行,因为DISTINCT. 您可以省略DISTINCT或定义视图中的所有内容,然后根据需要进行更新,无需显式锁定:http ://www.dba-oracle.com/t_ora_02014_cannot_select_for_update.htm

于 2010-04-06T15:22:02.920 回答
0

这可能取决于您要更新的内容。您可以 ... FOR UPDATE OF o.attrib1 告诉它您只对更新主表中的数据感兴趣,这似乎很可能是这种情况;这意味着它只会尝试锁定该表而不担心连接中的隐式视图。FOR UPDATE OF(并且您仍然可以更新该表中的多个列,命名一个仍然会锁定整行 - 尽管如果您在子句中指定要更新的所有列会更清楚)。

不知道这是否适用于 MySQL,这让我们回到 Mark Byers 的观​​点。

于 2010-04-06T16:15:44.203 回答