// you’re reading...

Programmieren

Merge SQL in Oracle

In Oracle Datenbanken ist es mittels PL/SQL möglich Skripte mit bedingten Verzweigungen zu erstellen. Jedoch muss nicht immer ein langes Skript geschrieben werden, da Oracle das Kommando MERGE mitbringt, mit welchem in einem langen (wenn auch nicht immer übersichtlichen) SQL-Statement eine bedingte Verzweigung steckt. In diese können INSERT- und UPDATE-Statements verwendet werden (in kurz auch UPSERT).

Beispiel Szenario

In einer Datenbanktabelle lager wird pro Ladungsträger das aktuelle Gewicht gespeichert. Die Tabelle hat folgenden Aufbau:

CREATE TABLE lager
(

ladungstraeger number,
regal number,
gewicht number

);

Um nun beispielsweise eine Auswertung zu machen, in welchem Regal wie hoch das Gewicht aller Ladungsträger ist. Um die Auswertung zu beschleunigen, wird jede Nacht eine Zusammenfassung pro Regal in folgende Tabelle geschrieben:

CREATE TABLE regale
(

regal number,
gesamtgewicht number

);

Möglichkeit 1: PL/SQL Skript

Das Aktualisieren der Tabelle regale könnte man mittels PL/SQL Skript lösen, welches IF-THEN-ELSE Konstrukte enthält. Diesen Weg beschreibe ich hier jetzt nicht weiter, sondern gehe zu Möglichkeit 2 über…

Möglichkeit 2: MERGE SQL

Die Syntax ist wie folgt:

MERGE INTO zieltabelle TARGET
USING suchbedingung SOURCE
ON verknüpfung-von-source-und-target
WHEN MATCHED THEN
gefundenen-satz-in-target-updaten
WHEN NOT MATCHED THEN
datensatz-in-target-ergänzen

Für das obige Beispiel ist folgendes ausgefüllte MERGE-Statement erforderlich:

MERGE INTO regale TARGET
USING (select regal, sum(gewicht) as gesamtgewicht from lager group by regal ) SOURCE
ON source.regal = target.regal
WHEN MATCHED THEN
update set target.gesamtgewicht = source.gesamtgewicht
WHEN NOT MATCHED THEN
insert (target.regal, target.gesamtgewicht) values (source.regal, source.gesamtgewicht)

Es ist auch möglich neben UPDATE und INSERT auch DELETE zu verwenden.
Das MERGE-SQL macht nun folgendes: Es prüft erst nach, ob ein Regal bereits in der target-Tabelle regale vorhanden ist. Ist dies der Fall, wird das Gewicht in diesem Satz aktualisiert. Ist das Regal noch nicht in der target-Tabelle, wird ein neuer Satz für das Regal angelegt.

Diskussion

Keine Kommentare für “Merge SQL in Oracle”

Kommentar schreiben