MERGE (SQL)

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

Dieses Dokument behandelt folgende Themen:

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 Datenbankmanagementsystem-Schnittstellen-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