UPDATEステートメントの構文は次のとおりです。
http://docs.oracle.com/cd/B19306_01 /server.102/b14200/statements_10007.htm
ここで、dml_table_expression_clause
は:
( subquery )
に注意してください 上記の構文の一部です。
subquery
は、結合の更新を実行できるようにする機能です。
最も単純な形式では、次のようになります。
UPDATE (
subquery-with-a-join
)
SET cola=colb
参加を更新する前に、ここにリストされている制限を知っておく必要があります:
https://docs.oracle.com/cd/B28359_01 /server.111/b28286/statements_8004.htm
- 集合演算子
- DISTINCTオペレーター
- 集計関数または分析関数
- GROUP BY、ORDER BY、MODEL、CONNECT BY、またはSTARTWITH句
- SELECTリストのコレクション式
- SELECTリストのサブクエリ
- 読み取り専用で指定されたサブクエリ
- Oracle Database管理者ガイドに記載されているように、いくつかの例外を除いて結合します
また、更新可能なビューに関連する一般的なルール-ここ(セクション:Updating a Join View
):
http:// docs .oracle.com / cd / B19306_01 / server.102 / b14231 / views.htm#sthref3055
まず、結合を使用してサブクエリを作成できます:
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
このクエリは単に次の結果を返します:
AGE
----------
30
これで、クエリの更新を試みることができます:
UPDATE (
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
)
SET age = age + 1;
しかし、エラーが発生します:
このエラーは、上記の制限の1つが満たされていないことを意味します(キー保存テーブル)。
ただし、テーブルに主キーを追加する場合:
alter table names add primary key( id );
alter table ages add primary key( id );
これで、更新はエラーなしで機能し、最終的な結果は次のようになります。
select * from ages;
ID AGE
---------- ----------
1 25
2 31
3 35