De syntaxis van het UPDATE-statement is:
http://docs.oracle.com/cd/B19306_01 /server.102/b14200/statements_10007.htm
waar dml_table_expression_clause
is:
Let op ( subquery )
onderdeel van de bovenstaande syntaxis.
De subquery
is een functie die het mogelijk maakt om een update van joins uit te voeren.
In de meest eenvoudige vorm kan het zijn:
UPDATE (
subquery-with-a-join
)
SET cola=colb
Voordat je een join bijwerkt, moet je de beperkingen kennen die hier worden vermeld:
https://docs.oracle.com/cd/B28359_01 /server.111/b28286/statements_8004.htm
- Een set-operator
- EEN DISTINCT-operator
- Een geaggregeerde of analytische functie
- Een clausule GROUP BY, ORDER BY, MODEL, CONNECT BY of START WITH
- Een collectie-uitdrukking in een SELECT-lijst
- Een subquery in een SELECT-lijst
- Een subquery aangeduid MET ALLEEN LEZEN
- Wordt lid, met enkele uitzonderingen, zoals beschreven in de Oracle Database Administrator's Guide
en ook algemene regels met betrekking tot bij te werken weergaven - hier (sectie:Updating a Join View
):
http://docs .oracle.com/cd/B19306_01/server.102/b14231/views.htm#sthref3055
We kunnen eerst een subquery maken met een join:
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
Deze zoekopdracht geeft eenvoudig het volgende resultaat:
AGE
----------
30
en nu kunnen we proberen onze vraag bij te werken:
UPDATE (
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
)
SET age = age + 1;
maar we krijgen een foutmelding:
Deze fout betekent dat aan een van de bovenstaande beperkingen niet wordt voldaan (tabel met bewaarde sleutel).
Als we echter primaire sleutels aan onze tabellen toevoegen:
alter table names add primary key( id );
alter table ages add primary key( id );
dan werkt de update nu foutloos en het uiteindelijke resultaat is:
select * from ages;
ID AGE
---------- ----------
1 25
2 31
3 35