MERGE (SQL)

#### Search Results

Search

# MERGE (SQL)

`MERGE INTO` table-name [[`AS`] correlation-name]
[include-columns] `USING` source-table
`ON` search-condition
{`WHEN` matching-condition `THEN` modification-operation}
[`ELSE IGNORE`]
[`NOT ATOMIC CONTINUE ON SQLEXCEPTION`]
[`QUERYNO` integer]

Dieses Dokument behandelt folgende Themen:

- Funktion

- Einschränkung

- Syntax-Beschreibung

- Beispiele

Eine Erläuterung der in dem Syntax-Diagramm verwendeten Symbole entnehmen Sie dem Abschnitt Syntax-Symbole.

Gehört zur Funktionsgruppe: Datenbankzugriffe und Datenbankänderungen

Siehe auch MERGE - SQL im Teil Natural for Db2 in der Database Management System Interfaces-Dokumentation.

## Funktion

Das `MERGE`-Statement aktualisiert eine Tabelle mit den angebenen Eingabedaten. Diejenigen Zeilen in der Zieltabelle, die zu den Eingabedaten passen, werden gemäß den Angaben aktualisiert, und Zeilen, welche in der Zieltabelle nicht vorhanden sind, werden eingefügt.

Das `MERGE`-Statement gehört zum SQL Extended Set.

## Einschränkung

Dieses Statement steht nur bei Natural for Db2 zur Verfügung.

## Syntax-Beschreibung

Syntax-Element | Beschreibung
--- | ---
`MERGE INTO` | MERGE INTO-Klausel: `MERGE INTO` initiiert ein SQL `MERGE`-Statement, das eine Kombination aus einem SQL `INSERT`- und einem SQL Searched `UPDATE`-Statement ist.
`table-name` | Tabellenname: Identifiziert das Ziel der `INSERT`- oder `UPDATE`-Operation des `MERGE`-Statement. Weitere Informationen siehe table-name.
`[AS] correlation-name` | [AS] correlation-name-Klausel: Gibt einen alternativen Namen für die Zieltabelle an. Der alternative Name kann als Qualifikationsmerkmal verwendet werden, wenn auf Spalten der Zwischenergebnistabelle verwiesen wird.
`include-columns` | Include Columns-Klausel: Gibt einen Satz von Spalten an, die zusammen mit den Spalten der Zieltabelle in die Ergebnistabelle des `MERGE`-Statements aufgenommen werden, wenn es in der `FROM`-Klausel eines `SELECT`-Statements geschachtelt ist. Die eingeschlossenen Spalten werden am Ende der durch die Zieltabelle identifizierten Spaltenliste angehängt. Weitere Informationen siehe include-columns.
`USING source-table` | USING source-table-Klausel: Gibt die Werte für die Zeilendaten an, die in der Zieltabelle zusammengeführt werden sollen. Siehe `source-table`
`ON search-condition` | ON search-condition-Klausel: Gibt Join-Bedingungen zwischen der Quelltabelle (`source-table`) und der Zieltabelle an. Jeder Spaltenname in der Suchbedingung muss eine Spalte der Zieltabelle oder der Quelltabelle bezeichnen.
`WHEN matching-condition` | WHEN matching-condition-Klausel: Gibt die Bedingung an, für die die in der folgenden `THEN`-Klausel definierte Änderungsoperation durchgeführt werden soll. Siehe `matching-condition`.
`THEN modification-operation` | THEN modification-operation-Klausel: Gibt die Operation an, die bei den Übereinstimmungen mit der in der vorangehenden `WHEN`-Klausel definierten Bedingung durchgeführt werden soll. Siehe `modification-operation`.
`ELSE IGNORE` | ELSE IGNORE-Klausel: Legt fest, dass bei Quellspalten, die die in der `WHEN`-Klausel angegebene Bedingung nicht erfüllen, keine Aktion durchgeführt wird.
`NOT ATOMIC CONTINUE ON SQLEXCEPTION` | NOT ATOMIC CONTINUE ON SQLEXCEPTION-Klausel: Gibt an, ob die Zusammenführungsverarbeitung fortgesetzt wird, wenn bei der Verarbeitung einer Zeile eines Satzes von Quellzeilen ein Fehler auftritt.
`QUERYNO integer` | QUERYNO integer-Klausel: Gibt die Nummer für dieses SQL-Statement an, die in der EXPLAIN-Ausgabe und den Db2-Trace-Aufzeichnungen verwendet wird.

### source-table

table-reference
(`VALUES` |  | values-single-row values-multiple-row |  | )
[`AS`] correlation-name (column-name,...)

Syntax-Element | Beschreibung
--- | ---
`table-reference` | Gibt die Quelltabelle an, die mit der Zieltabelle zusammengeführt werden soll.
`VALUES` | Mit dem Schlüsselwort `VALUES` wird die Angabe von Werten für die Zeilendaten eingeleitet, die in die Zieltabelle eingefügt werden sollen..
`values-single-row` | Gibt eine einzelne Zeile der Quelldaten an. Siehe values-single-row.
`values-multiple-row` | Gibt mehrere Zeilen der Quelldaten an. Siehe values-multiple-row.
`[AS] correlation-name` | Gibt einen Korrelationsnamen für die Quelltabelle an.
`column-name` | Gibt einen Spaltennamen an, um die Eingabedaten mit der `UPDATE SET` assignment-clause (Zuweisungsklausel) für eine `UPDATE`-Operation oder mit der `VALUES`-Klausel für eine `INSERT`-Operation zu verbinden.

### matching-condition

[`NOT`] `MATCHED` [`AND` search-condition]

Syntax-Element | Beschreibung
--- | ---
`[NOT] MATCHED` | Gibt die `modification-operation` (Änderungsoperation) an, die durchgeführt werden soll, wenn eine `ON search-condition`-Suchbedingung als wahr oder nicht wahr ausgewertet wird (`NOT` kann optional angegeben werden).
`AND search-condition` | Gibt eine (optionale) zusätzliche Bedingung an, die als wahr ausgewertet werden muss, bevor die `modification-operation` durchgeführt wird.

### modification-operation

`update-operation`)
`DELETE`
`signal-operation`
`insert-operation`

Syntax-Element | Beschreibung
--- | ---
`update-operation` | Gibt an, dass die übereinstimmende Zielzeile mit den in der Zuweisungsklausel (`UPDATE SET` assignment-clause) zugewiesenen Werten geändert wird. Eine `UPDATE`-Operation ist nur zulässig, wenn die Übereinstimmungsbedingung (`matching-condition`) als wahr ausgewertet wird.
`DELETE` | Gibt an, dass die übereinstimmende Zielzeile gelöscht wird. Eine `DELETE`-Operation ist nur zulässig, wenn die Übereinstimmungsbedingung (`matching-condition`) als wahr ausgewertet wird.
`signal-operation` | Gibt den SQL-Fehler an, der ausgelöst werden soll. Eine `SIGNAL`-Operation ist nur zulässig, wenn die Übereinstimmungsbedingung (`matching-condition`) als wahr ausgewertet wird.
`insert-operation` | Gibt die Zeilen an, die in die Zieltabelle eingefügt werden sollen. Eine `INSERT`-Operation ist nur zulässig, wenn die Übereinstimmungsbedingung (`matching-condition`) als nicht wahr ausgewertet wird.

### signal-operation

`SIGNAL` `SQLSTATE [VALUE]` sqlstate [`SET MESSAGE_TEXT` `= scalar-expression`]

Syntax-Element | Beschreibung
--- | ---
`SIGNAL` | Gibt die `SIGNAL`-Operation an, die ausgeführt werden soll, wenn die Übereinstimmungsbedingung (`matching-condition`) als wahr ausgewertet wird. Db2 setzt einen SQLCODE `-438`, wenn ein Fehler durch das `SIGNAL`-Statement angezeigt wird.
`SQLSTATE [VALUE] sqlstate` | Gibt den SQLSTATE an, der von Db2 gesetzt werden soll. `sqlstate` ist eine 5 Zeichen lange alphanumerische Konstante oder eine alphanumerische Variable. `sqlstate`-Werte werden SQLSTATE von Db2 zugewiesen. Empfohlene Werte finden Sie in der entsprechenden Db2-Dokumentation.
`SET MESSAGE_TEXT``= scalar-expression` | Diese optionale Klausel gibt eine Fehler- oder Warnmeldung an, die in das Feld SQLEERRMC der SQLCA gestellt wird oder die mit dem Statement `GET DIAGNOSTICS` abgerufen werden kann.

### values-single-row

|  |  | expression `NULL` |  |  |
( |  | expression `NULL` |  | ,...)

Syntax-Element | Beschreibung
--- | ---
`expression` | Skalar-Ausdruck: Gibt einen Skalar-Ausdruck an. Siehe Skalar-Ausdrücke.
`NULL` | NULL-Wert: Gibt den `NULL`-Wert an.

### values-multiple-row

|  |  | expression host-variable-array `NULL` |  |  |  | `FOR` |  | host-variable integer-constant |  | `ROWS`
( |  | expression host-variable-array `NULL` |  | ,...)

Syntax-Element | Beschreibung
--- | ---
`expression` | Skalar-Ausdruck: Gibt einen Skalar-Ausdruck an. Siehe Skalar-Ausdrücke.
`host-variable-array` | Host-Variablen-Array: Gibt ein Benutzervariablen-Array oder einen Indexbereich eines Array an. Wenn ein `host-variable-array` angegeben wird, muss die Compiler-Option `DB2ARRY` auf `ON` gesetzt werden. Mit dem Schlüsselwort `INDICATOR` kann ein optionales Indikator-Array angegeben werden: `host-variable-array INDICATOR [:]indicator-arry`.
`NULL` | NULL-Wert: Gibt den `NULL`-Wert an.
`FOR ... ROWS` | Anzahl der zusammenzuführenden Zeilen: Diese Klausel gibt die Anzahl der zusammenzuführenden Zeilen an. `host-variable` oder `integer-constant` wird ein Wert `k` zugewiesen. `k` muss im Bereich von `0` bis `32767` liegen und muss kleiner als die oder gleich der Minimalgröße aller angegebenen Benutzervariablen-Arrays sein.

### update-operation

`UPDATE SET` assignment-clause

Syntax-Element | Beschreibung
--- | ---
`UPDATE SET` | Gibt an, welche Aktualisierungsoperation ausgeführt werden soll, wenn die Auswertung ergibt, dass die Suchbedingung (`search-condition`) wahr ist. Siehe `assignment-clause` weiter unten.

### assignment-clause

| column-name = |  | expression |  |  |  | ,...
`DEFAULT`
`NULL`
(column-name,...) = ( |  | expression |  | ,...)
`DEFAULT`
`NULL`

Syntax-Element | Beschreibung
--- | ---
`column-name` | Gibt den Namen der Spalte an, für die ein Einfügewert vorgesehen ist.
`expression` | Gibt den neuen Wert für die Spalte an. Ein Ausdruck (`expression`) kann Referenzen auf Spalten der Quellentabelle (`source-table`) oder der Zieltabelle enthalten. `expression` kann keine Referenzen auf enthaltene Spalten enthalten.
`DEFAULT` | Gibt den Standardwert `DEFAULT` für die Spalte an. Der Wert, welcher zugewiesen wird, hängt davon ab, wie die Spalte definiert ist.
`NULL` | Gibt den Wert `NULL` als neuen Wert für die Spalte an.

### insert-operation

`INSERT` [(column-name,...)] `VALUES` ( |  | expression `DEFAULT`) `NULL` |  | ,...)

Syntax-Element | Beschreibung
--- | ---
`INSERT` | Gibt die Einfügeoperation an, die ausgeführt werden soll, wenn die Suchbedingung (`search-condition`) nicht wahr ist.
`column-name` | Gibt die Spalte, für die ein Einfügewert vorgesehen ist.
`VALUES` | Mit diesem Schlüsselwort werden ein oder mehrere einzufügende Spaltenwerte eingeleitet.
`expression` | Gibt den neuen Wert für die Spalte an. Ein Ausdruck (expression) kann Referenzen auf Spalten der Quellentabelle enthalten. `expression` kann keine Referenzen auf Spalten der Zieltabelle enthalten.
`DEFAULT` | Gibt den Standardwert `DEFAULT` für die Spalte an. Der Wert, welcher zugewiesen wird, hängt davon ab, wie die Spalte definiert ist.
`NULL` | Gibt den Wert `NULL` als neuen Wert für die Spalte an.

## Beispiele

#### Beispiel 1:

Aktualisieren der Bestandsliste eines Kfz-Vertragshändlers. Hinzufügen eines neuen Fahrzeugmodells zur Bestandsliste bzw. Aktualisieren der Informationen über vorhandes Fahrzeugmodell, welches schon in der Bestandsliste existiert.

    DEFINE DATA LOCAL
    01 #MODEL (A20)
    01 #DELTA (I4)
    END-DEFINE
    * Setup input host variables
    ASSIGN #MODEL = ‘Grand Turbo’
    ASSIGN #DELTA := 5
    * Insert/Update into INVENTORY table
    MERGE INTO CDS-INVENTORY T
      USING (VALUES (:#MODEL, :#DELTA)) AS S(MODEL, DELTA)
      ON T.MODEL = S.MODEL
    WHEN MATCHED THEN UPDATE SET T.QUANTITY = T.QUANTITY + S.DELTA
    WHEN NOT MATCHED THEN INSERT VALUES (S.MODEL, S.DELTA)
    END TRANSACTION
    END

#### Beispiel 2:

Aktualisieren der Bestandsliste eines Kfz-Vertragshändlers. Hinzufügen neuer Fahrzeugmodelle zur Bestandsliste und Aktualisieren der Informationen über vorhande Fahrzeugmodelle, welche schon in der Bestandsliste existieren. Die Eingabe kommt aus Natural-Arrays. Der spezifische Code der Arrays ist in Fettdruck dargestellt.

    OPTIONS DB2ARRY ON
    DEFINE DATA LOCAL
    01 #MODEL_ARR (A20/1:20)
    01 #DELTA_ARR (I4/1:20))
    01 #ROW-COUNT (I4)
    01 #NUM-ERRORS (I4)
    01 #SQLCODE    (I4)
    01 #SQLSTATE   (A5)
    01 #ROW-NUM    (I4)
    END-DEFINE
    * Setup input host variables
    ASSIGN #MODEL_ARR(1) = ‘Grand Turbo’
    ASSIGN #DELTA_ARR(1) := 5
    ASSIGN #MODEL_ARR(2) = ‘Blue Car’
    ASSIGN #DELTA_ARR(2) := 3
    . . .
    * Insert/Update into INVENTORY table
    CALLNAT 'NDBNOERR'
    MERGE INTO CDS-INVENTORY T
      USING (VALUES (:#MODEL_ARR(*), :#DELTA_ARR(*))
      FOR 20 ROWS)
      AS S(MODEL, DELTA)
    ON T.MODEL = S.MODEL
    WHEN MATCHED THEN UPDATE SET T.QUANTITY = T.QUANTITY + S.DELTA
    WHEN NOT MATCHED THEN INSERT VALUES (S.MODEL, S.DELTA)
    NOT ATOMIC CONTINUE ON SQLEXCEPTION
    * Check outcome of MERGE
    PROCESS SQL SYSIBM-SYSDUMMY1
      <<GET DIAGNOSTICS
      :#ROW-COUNT  = ROW_COUNT
      ,:#NUM-ERRORS = NUMBER>>
    WRITE 'Number of rows merged             :' #ROW-COUNT /
          'NUMBER OF ERRORS                  :' #NUM-ERRORS
    IF #NUM-ERRORS > 0
      FOR #I = 1 TO #NUM-ERRORS
        PROCESS SQL SYSIBM-SYSDUMMY1
          <<GET DIAGNOSTICS CONDITION   :#I
          :#SQLCODE   = DB2_RETURNED_SQLCODE,
          :#SQLSTATE  = RETURNED_SQLSTATE,
          :#ROW_NUM = DB2_ROW_NUMBER>>
        PRINT 'DB2_RETURNED_SQLCODE:' #SQLCODE
          'RETURNED_SQLSTATE:' #SQLSTATE
          'DB2_ROW_NUMBER:' #ROW_NUM (EM=99Z)
      END-FOR
    END-IF
    END TRANSACTION
    END

#### Beispiel 3:

Zusammenführung von Verkaufsdaten aus der Tabelle `MSALES` in die Tabelle `MPRODUCT`. Demonstration der `MERGE`-Operation mit den Statements `DELETE`, `UPDATE`, `INSERT` und `SIGNAL`.

    DEFINE DATA
    LOCAL USING DEMSQLCA
    LOCAL
    1 V1 VIEW OF MPRODUCT
    2 ID
    2 NAME
    2 INVENTORY
    1  #M_TEXT  (A10) INIT <'Oversold: '>
       END-DEFINE
    ...
    MERGE INTO MPRODUCT AS T
          USING (SELECT MSALES.ID        ,SUM(MSALES.SOLD) AS SOLD,
                         MAX(MCATALOG.NAME) AS NAME
                   FROM MSALES, MCATALOG
                   WHERE MSALES.ID = MCATALOG.ID
                   GROUP BY MSALES.ID) AS S
                   (ID,SOLD,NAME)
          ON S.ID = T.ID
          WHEN MATCHED AND T.INVENTORY = S.SOLD
                       THEN DELETE
          WHEN MATCHED AND T.INVENTORY < S.SOLD
                       THEN SIGNAL SQLSTATE '78000'
                            SET MESSAGE_TEXT =:#M_TEXT     || S.NAME
          WHEN MATCHED
                       THEN UPDATE SET T.INVENTORY = T.INVENTORY - S.SOLD
          WHEN NOT MATCHED
                       THEN INSERT VALUES(S.ID, S.NAME, -S.SOLD)
    END TRANSACTION
    END

### On this page

- Funktion
- Einschränkung
- Syntax-Beschreibung
- Beispiele