Синтаксисът на оператора 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 или START WITH
- Израз за колекция в списък SELECT
- Подзаявка в списък SELECT
- Подзаявка, обозначена САМО ЗА ЧЕТЕНЕ
- Присъединява се, с някои изключения, както е документирано в Ръководството на администратора на база данни на Oracle
както и общи правила, свързани с обновяеми изгледи - тук (раздел: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;
но получаваме грешка:
Тази грешка означава, че едно от горните ограничения не е изпълнено (таблица със запазен ключ).
Ако обаче добавим първични ключове към нашите таблици:
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