Verwendet für
Zusammenführen von Daten aus einem Quellsatz in eine Zielrelation
Syntax
MERGE INTO target [[AS] target_alias]
USING <source> [[AS] source_alias]
ON <join_condition>
<merge_when> [<merge_when> ...]
[RETURNING <returning_list> [INTO <variables>]]
<merge_when> ::=
<merge_when_matched>
| <merge_when_not_matched>
<merge_when_matched> ::=
WHEN MATCHED [ AND <condition> ] THEN
{ UPDATE SET <assignment-list>
| DELETE }
<merge_when_not_matched> ::=
WHEN NOT MATCHED [ AND <condition> ] THEN
INSERT [( <column_list> )] [<override_opt>]
VALUES ( <value_list> )
<source> ::= tablename | (<select_stmt>)
<assignment_list ::=
col_name = <m_value> [, <col_name> = <m_value> ...]]
<override_opt> ::=
OVERRIDING {USER | SYSTEM} VALUE
<column_list> ::= colname [, colname ...]
<value_list> ::= <m_value> [, <m_value> ...]
<m_value> ::= <value_expression> | DEFAULT
<returning_list> ::= * | <output_column> [, <output_column]
<output_column> ::=
target.* | NEW.* | OLD.*
| <return_expression> [COLLATE collation] [[AS] alias]
<return_expression> ::=
<value_expression>
| [target.]col_name
| NEW.col_name
| OLD.col_name
<value_expression> ::=
<literal>
| <context-variable>
| any other expression returning a single
value of a Firebird data type or NULL
<variables> ::=
[:]varname [, [:]varname ...]
Table 1. Argumente für die MERGE
-Anweisungsparameter
Argument |
Beschreibung |
target |
Name der Zielbeziehung (Tabelle oder aktualisierbare Sicht) |
source |
Datenquelle.Dies kann eine Tabelle, eine Ansicht, eine gespeicherte Prozedur oder eine abgeleitete Tabelle sein |
target_alias |
Alias für die Zielbeziehung (Tabelle oder aktualisierbare Ansicht) |
source_alias |
Alias für die Quellrelation oder Menge |
join_conditions |
Die (ON ) Bedingung(en) zum Abgleichen der Quelldatensätze mit denen im Ziel |
condition |
Zusätzliche Testbedingung in der Klausel WHEN MATCHED oder WHEN NOT MATCHED |
tablename |
Tabellen- oder Ansichtsname |
select_stmt |
Select-Anweisung der abgeleiteten Tabelle |
col_name |
Name einer Spalte in der Zielrelation |
value_expression |
Der einer Spalte in der Zieltabelle zugewiesene Wert.Dieser Ausdruck kann ein Literalwert, eine PSQL-Variable, eine Spalte aus der Quelle oder eine kompatible Kontextvariable sein |
return_expression |
Der in der RETURNING -Klausel zurückzugebende AusdruckKann ein Spaltenverweis auf Quelle oder Ziel oder ein Spaltenverweis des NEW - oder OLD -Kontexts des Ziels oder ein Wert sein. |
ret_alias |
Alias für den Wertausdruck in der RETURNING -Klausel |
varname |
Name einer lokalen PSQL-Variablen |
Die 'MERGE'-Anweisung führt Datensätze aus der Quelle in eine Zieltabelle oder eine aktualisierbare Sicht zusammen.Die Quelle kann eine Tabelle, ein View oder “alles, was mit SELECT
abfragen” können.Jeder Quelldatensatz wird verwendet, um einen oder mehrere Zieldatensätze zu aktualisieren, einen neuen Datensatz in die Zieltabelle einzufügen, einen Datensatz aus der Zieltabelle zu löschen oder nichts zu tun.
Welche Aktion ausgeführt wird, hängt von der angegebenen Join-Bedingung, der/den WHEN
-Klausel(n) und der - optionalen - Bedingung in der WHEN
-Klausel ab.Die Join-Bedingung und die Bedingung im WHEN
enthalten normalerweise einen Vergleich von Feldern in den Quell- und Zielbeziehungen.
Mehrere WHEN MATCHED
- und WHEN NOT MATCHED
-Klauseln sind zulässig.Für jede Zeile in der Quelle werden die WHEN
-Klauseln in der Reihenfolge überprüft, in der sie in der Anweisung angegeben sind.Wenn die Bedingung in der WHEN
-Klausel nicht als wahr ausgewertet wird, wird die Klausel übersprungen und die nächste Klausel wird geprüft.Dies wird getan, bis die Bedingung für eine WHEN
-Klausel wahr ist oder eine WHEN
-Klausel ohne Bedingung zutrifft oder es keine WHEN
-Klauseln mehr gibt.Wenn eine übereinstimmende Klausel gefunden wird, wird die mit der Klausel verknüpfte Aktion ausgeführt.Für jede Zeile in der Quelle wird höchstens eine Aktion ausgeführt.Wenn die Klausel WHEN MATCHED
vorhanden ist und mehrere Datensätze mit einem einzigen Datensatz in der Zieltabelle übereinstimmen, wird ein Fehler ausgegeben.
Warning
|
Mindestens eine WHEN -Klausel muss vorhanden sein.
WHEN NOT MATCHED wird aus der Quellsicht ausgewertet, dh der in USING angegebenen Tabelle oder Menge.Es muss so funktionieren, denn wenn der Quelldatensatz nicht mit einem Zieldatensatz übereinstimmt, wird INSERT ausgeführt.Wenn es einen Zieldatensatz gibt, der nicht mit einem Quelldatensatz übereinstimmt, wird natürlich nichts unternommen.
Derzeit gibt die Variable ROW_COUNT den Wert 1 zurück, auch wenn mehr als ein Datensatz geändert oder eingefügt wird.Einzelheiten und Fortschritte finden Sie unter firebird#4722.
|