Die Syntax der UPDATE-Anweisung lautet:
http://docs.oracle.com/cd/B19306_01 /server.102/b14200/statements_10007.htm
wobei dml_table_expression_clause
ist:
Bitte achten Sie auf ( subquery )
Teil der obigen Syntax.
Die subquery
ist eine Funktion, die es ermöglicht, Joins zu aktualisieren.
In der einfachsten Form kann es sein:
UPDATE (
subquery-with-a-join
)
SET cola=colb
Bevor Sie einen Join aktualisieren, müssen Sie die hier aufgeführten Einschränkungen kennen:
https://docs.oracle.com/cd/B28359_01 /server.111/b28286/statements_8004.htm
- Ein Mengenoperator
- Ein DISTINCT-Operator
- Eine Aggregat- oder Analysefunktion
- Eine GROUP BY-, ORDER BY-, MODEL-, CONNECT BY- oder START WITH-Klausel
- Ein Sammlungsausdruck in einer SELECT-Liste
- Eine Unterabfrage in einer SELECT-Liste
- Eine Unterabfrage mit der Bezeichnung WITH READ ONLY
- Joins, mit einigen Ausnahmen, wie im Oracle Database Administrator's Guide dokumentiert
und auch allgemeine Regeln in Bezug auf aktualisierbare Ansichten - hier (Abschnitt:Updating a Join View
):
http://docs .oracle.com/cd/B19306_01/server.102/b14231/views.htm#sthref3055
Wir können zuerst eine Unterabfrage mit einem Join erstellen:
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
Diese Abfrage gibt einfach das folgende Ergebnis zurück:
AGE
----------
30
und jetzt können wir versuchen, unsere Abfrage zu aktualisieren:
UPDATE (
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
)
SET age = age + 1;
aber wir erhalten einen Fehler:
Dieser Fehler bedeutet, dass eine der oben genannten Einschränkungen nicht erfüllt ist (key-preserved table).
Wenn wir jedoch Primärschlüssel zu unseren Tabellen hinzufügen:
alter table names add primary key( id );
alter table ages add primary key( id );
Dann funktioniert das Update jetzt ohne Fehler und das Endergebnis ist:
select * from ages;
ID AGE
---------- ----------
1 25
2 31
3 35