Składnia instrukcji UPDATE to:
http://docs.oracle.com/cd/B19306_01 /server.102/b14200/statements_10007.htm
gdzie dml_table_expression_clause
jest:
Proszę zwrócić uwagę na ( subquery )
część powyższej składni.
subquery
to funkcja, która pozwala wykonać aktualizację złączeń.
W najprostszej formie może to być:
UPDATE (
subquery-with-a-join
)
SET cola=colb
Przed aktualizacją przyłączenia musisz znać ograniczenia wymienione tutaj:
https://docs.oracle.com/cd/B28359_01 /server.111/b28286/statements_8004.htm
- Operator zbioru
- ODRÓŻNY operator
- Funkcja agregująca lub analityczna
- klauzula GROUP BY, ORDER BY, MODEL, CONNECT BY lub START WITH
- Wyrażenie kolekcji na liście SELECT
- Podzapytanie na liście WYBIERZ
- Podzapytanie oznaczone TYLKO DO ODCZYTU
- Dołączenia, z pewnymi wyjątkami, zgodnie z dokumentacją w Przewodniku administratora bazy danych Oracle
a także wspólne reguły związane z aktualizowalnymi widokami - tutaj (sekcja:Updating a Join View
):
http://docs .oracle.com/cd/B19306_01/server.102/b14231/views.htm#sthref3055
Najpierw możemy utworzyć podzapytanie z połączeniem:
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
To zapytanie po prostu zwraca następujący wynik:
AGE
----------
30
a teraz możemy spróbować zaktualizować nasze zapytanie:
UPDATE (
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
)
SET age = age + 1;
ale pojawia się błąd:
Ten błąd oznacza, że jedno z powyższych ograniczeń nie jest spełnione (tabela z zachowaniem klucza).
Jeśli jednak dodamy klucze podstawowe do naszych tabel:
alter table names add primary key( id );
alter table ages add primary key( id );
to teraz aktualizacja działa bez żadnych błędów, a ostateczny wynik to:
select * from ages;
ID AGE
---------- ----------
1 25
2 31
3 35