Hallo, mein Name ist Christoph Jahn. Ich bin ein Softwareentwickler und Fotograf aus Leipzig.

Oracle: Mehrere Felder mit einem Subselect ändern

2013-03-13

Letzte Woche stand ich vor dem Problem, dass ich mit einem UPDATE-Statement mehr als nur ein Feld verändern musste. Da die zu verändernde Tabelle recht groß war und die Bedingung, mit der die Daten ausgewählt wurden ziemlich komplex, konnte ich nicht mein übliches Verfahren anwenden.

Bisher löste ich das immer indem ich mehrere UPDATE-Anweisungen hintereinander ausgeführt habe. Jede Anweisung änderte ein eigenes Feld. Hier ein Beispiel, wie ich es früher gemacht habe:

-- Erstes UPDATE
UPDATE
tabelle
SET
feld1 = (SELECT sfeld1 FROM tab WHERE id = '12')
WHERE
anderes_feld = 'suche';
-- Zweites UPDATE
UPDATE
tabelle
SET
feld2 = (SELECT sfeld2 FROM tab WHERE id = '12')
WHERE
anderes_feld = 'suche';

Grundsätzlich ist daran nichts auszusetzen. Für einfache Tabellen, die nicht Millionen von Einträgen enthalten und nicht in einem Produktivsystem arbeiten, war das vollkommen ausreichend. Doch gibt es eine elegantere und einfachere Möglichkeit. Wie wäre es, wenn man die Änderung mit nur einem Statement abschicken könnte? Seht Euch das hier mal an:

UPDATE
tabelle
SET
(feld1, feld2) = (SELECT sfeld1, sfeld2 FROM [...])
WHERE
anderes_feld = 'suche';

Ist doch wesentlich einfacher und schneller, als zwei Anfragen an den Server zu schicken. Die Datenbank muss nur einmal nach den Kriterien filtern und kann die Änderung gleich durchführen... Man lernt doch nie aus.