Syntaxen för UPDATE-satsen är:
http://docs.oracle.com/cd/B19306_01 /server.102/b14200/statements_10007.htm
där dml_table_expression_clause
är:
Var uppmärksam på ( subquery )
en del av ovanstående syntax.
subquery
är en funktion som gör det möjligt att utföra en uppdatering av anslutningar.
I den enklaste formen kan det vara:
UPDATE (
subquery-with-a-join
)
SET cola=colb
Innan du uppdaterar en anslutning måste du känna till begränsningarna som anges här:
https://docs.oracle.com/cd/B28359_01 /server.111/b28286/statements_8004.htm
- En uppsättningsoperator
- EN DISTINKT operator
- En aggregerad eller analytisk funktion
- EN GROUP BY, ORDER BY, MODEL, CONNECT BY eller START WITH-sats
- Ett samlingsuttryck i en SELECT-lista
- En underfråga i en SELECT-lista
- En underfråga betecknad MED ENDAST läs
- Gå med, med vissa undantag, enligt dokumentationen i Oracle Database Administrator's Guide
och även vanliga regler relaterade till uppdateringsbara vyer - här (avsnitt:Updating a Join View
):
http://docs .oracle.com/cd/B19306_01/server.102/b14231/views.htm#sthref3055
Vi kan först skapa en underfråga med en join:
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
Denna fråga returnerar helt enkelt följande resultat:
AGE
----------
30
och nu kan vi försöka uppdatera vår fråga:
UPDATE (
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
)
SET age = age + 1;
men vi får ett felmeddelande:
Detta fel betyder att en av ovanstående begränsningar inte uppfylls (nyckelbevarad tabell).
Men om vi lägger till primärnycklar till våra tabeller:
alter table names add primary key( id );
alter table ages add primary key( id );
då fungerar uppdateringen utan några fel och ett slutligt resultat är:
select * from ages;
ID AGE
---------- ----------
1 25
2 31
3 35