Oracle
 sql >> Datenbank >  >> RDS >> Oracle

UPDATE mit JOIN-Syntax für Oracle Database

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