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:ビューから更新用を選択できません

クエリを変更する必要がありますか、それとも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 が、これはおそらくそうです。これは、そのテーブルをロックしようとするだけで、結合の暗黙的なビューについて心配しないことを意味します。(そして、そのテーブル内の複数の列を更新することもできます。1つに名前を付けると、行全体がロックされます。ただし、更新するすべての列をFOR UPDATE OF句で指定すると、より明確になります)。

それがMySQLで機能するかどうかはわかりませんが、MarkByersのポイントに戻ります。

于 2010-04-06T16:15:44.203 に答える