La sintassi dell'istruzione UPDATE è:
http://docs.oracle.com/cd/B19306_01 /server.102/b14200/statements_10007.htm
dove dml_table_expression_clause
è:
Si prega di prestare attenzione a ( subquery )
parte della sintassi di cui sopra.
La subquery
è una funzionalità che consente di eseguire un aggiornamento dei join.
Nella forma più semplice può essere:
UPDATE (
subquery-with-a-join
)
SET cola=colb
Prima di aggiornare un join, devi conoscere le restrizioni elencate qui:
https://docs.oracle.com/cd/B28359_01 /server.111/b28286/statements_8004.htm
- Un operatore di insiemi
- Un operatore DISTINCT
- Una funzione aggregata o analitica
- Una clausola GROUP BY, ORDER BY, MODEL, CONNECT BY o START WITH
- Un'espressione di raccolta in un elenco SELECT
- Una sottoquery in un elenco SELECT
- Una sottoquery designata CON SOLA LETTURA
- Partecipa, con alcune eccezioni, come documentato in Oracle Database Administrator's Guide
e anche regole comuni relative alle viste aggiornabili - qui (sezione:Updating a Join View
):
http://docs .oracle.com/cd/B19306_01/server.102/b14231/views.htm#sthref3055
Possiamo prima creare una sottoquery con un join:
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
Questa query restituisce semplicemente il seguente risultato:
AGE
----------
30
e ora possiamo provare ad aggiornare la nostra query:
UPDATE (
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
)
SET age = age + 1;
ma otteniamo un errore:
Questo errore significa che una delle limitazioni di cui sopra non è soddisfatta (tabella di conservazione delle chiavi).
Tuttavia, se aggiungiamo chiavi primarie alle nostre tabelle:
alter table names add primary key( id );
alter table ages add primary key( id );
quindi ora l'aggiornamento funziona senza alcun errore e un risultato finale è:
select * from ages;
ID AGE
---------- ----------
1 25
2 31
3 35