13 Stimmen

Verwendung einer Subquery anstelle eines Tabellennamens in einer Oracle Update-Anweisung

Ich muss eine Aktualisierungsanweisung schreiben, die mehrere Tabellen verwendet, um zu bestimmen, welche Zeilen aktualisiert werden sollen, da in Oracle mehrere Tabellen nicht zulässig sind. Die folgende Abfrage gibt einen "ORA-00971: Fehlendes SET-Schlüsselwort"-Fehler

UPDATE
  TABLE1 a,
  TABLE2 b
SET
  a.COL1 = 'VALUE'
WHERE
  a.FK = b.PK
  AND b.COL2 IN ('SET OF VALUES')

Beim Nachschlagen der Syntax der UPDATE-Anweisung in Oracle habe ich Folgendes gefunden enlace die zeigt, dass Sie eine Unterabfrage anstelle eines Tabellennamens verwenden können.

Als ich versuchte, die Abfrage so zu schreiben, erhielt ich die Meldung "ORA-01779: Cannot modify a column which maps to a non key-preserved table"

UPDATE
  (
    SELECT
      a.COL1
    FROM
      TABLE1 a,
      TABLE2 b
    WHERE
      a.FK = b.PK
      AND b.COL2 IN ('SET OF VALUES')
  ) update_tbl
SET
  update_tbl.COL1 = 'VALUE'

Ich habe die Abfrage umgeschrieben (siehe unten), indem ich stattdessen eine EXISTS-Anweisung verwendet habe, und es funktioniert gut, aber ich würde trotzdem gerne wissen, wie das gemacht wird.

UPDATE
  TABLE1 update_tbl
SET
  update_tbl.COL1 = 'VALUE'
WHERE
  EXISTS (
    SELECT
      1
    FROM
      TABLE1 a
      TABLE2 b
    WHERE
      a.FK = b.PK
      AND b.COL2 IN ('SET OF VALUES')
      AND update_tbl.PK = a.PK
  )

Danke! -Nate

0voto

Chris Ammerman Punkte 14591

Jede Zeile in der Ergebnismenge der Abfrage in Ihrer UPDATE-Klausel muss einer einzigen Zeile in der zu aktualisierenden Tabelle zugeordnet werden, und zwar in einer Weise, die Oracle automatisch nachvollziehen kann. Da es sich bei der Abfrage in Wirklichkeit um eine Ansicht handelt, muss Oracle in der Lage sein, die Ansicht mit der Zieltabelle zu verknüpfen, um zu wissen, welche Zeile zu aktualisieren ist.

Das bedeutet im Wesentlichen, dass Sie den Primärschlüssel der Zieltabelle in diese Abfrage aufnehmen müssen. Möglicherweise können Sie auch andere eindeutige Indexfelder verwenden, aber ich kann nicht garantieren, dass das Oracle DBMS intelligent genug ist, um dies zu ermöglichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X