Firebird Documentation IndexFirebird 2.5 SprachreferenzStatements der Data Manipulation Language (DML) → MERGE
Firebird Home Firebird Home Zurück: DELETEFirebird Documentation IndexNach oben: Statements der Data Manipulation Language (DML)Weiter: EXECUTE PROCEDURE

MERGE

Verwendet für:  Daten aus einer Quellenmenge in eine Zielbeziehung zusammenführen

Verfügbar in: DSQL, PSQL

Syntax: 

MERGE INTO target [[AS] target-alias]
   USING source [[AS] source-alias]
   ON join-condition
   WHEN MATCHED THEN UPDATE SET colname = value [, colname = value ...]
   WHEN NOT MATCHED THEN INSERT [(<columns>)] VALUES (<values>)

<columns>  ::=  colname [, colname ...]
<values>   ::=  value   [, value   ...]
        

Tabelle 6.15. Argumente der MERGE-Statement-Parameter

Argument Beschreibung
target Name der Zielbeziehung (Tabelle oder änderbare Sicht)
source Datenquelle. Es kann eine Tabelle, eine Ansicht, eine gespeicherte Prozedur oder eine abgeleitete Tabelle sein
target-alias Alias für die Zielbeziehung (Tabelle oder änderbare Sicht)
source-alias Alias für die Quellbeziehung oder den Quellsatz
join-conditions Die (ON) Bedingung(en) zum Abgleich der Quelldatensätze mit denen im Ziel
colname Name einer Spalte in der Zielbeziehung
value Der Wert, der einer Spalte in der Zieltabelle zugewiesen ist. Es ist ein Ausdruck, der ein Literalwert, eine PSQL-Variable, eine Spalte aus der Quelle oder eine kompatible Kontextvariable sein kann


Beschreibung

Das MERGE-Statement führt Daten in einer Tabelle oder aktualisierbaren Sicht zusammen. Die Quelle kann eine Tabelle, eine Sicht oder ein allgemeines „SELECT FROM“ sein. Jeder Quelldatensatz wird verwendet, um einen oder mehrere Zieldatensätze zu aktualisieren, einen neuen Datensatz in die Zieltabelle einzufügen oder keinen.

Die durchgeführte Aktion hängt von der angegebenen Join-Bedingung und den WHEN-Klauseln ab. Die Bedingung enthält normalerweise einen Vergleich der Felder in den Quell- und Zielbeziehungen.

Hinweise

Nur eine der WHEN-Klauseln kann bereitgestellt werden. Dies wird sich in der nächsten Hauptversion von Firebird ändern, wenn Compound-Matching-Bedingungen unterstützt werden.

WHEN NOT MATCHED wird aus der Quellensicht ausgewertet, d. h. der Tabelle oder dem Satz, der in USING angegeben ist. Die ist zwangsläufig so, da INSERT ausgeführt wird, wenn der Quelldatensatz keinem Zieldatensatz entspricht. Wenn es einen Zieldatensatz gibt, der keinem Quelldatensatz entspricht, 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 Fortschritt finden Sie unter Tracker ticket CORE-4400.

ACHTUNG :: Eine weitere Unregelmäßigkeit!

Wenn die Klausel WHEN MATCHED vorhanden ist und mehrere Datensätze einem einzelnen Datensatz in der Zieltabelle entsprechen, wird ein UPDATE für diesen Zieldatensatz je übereinstimmender Quelle ausgeführt, wobei jedes nachfolgende Update das vorherige überschreibt. Dieses Verhalten entspricht nicht dem SQL: 2003-Standard, der erfordert, dass diese Situation eine Ausnahme (einen Fehler) auslöst.

Beispiele: 

MERGE INTO books b
  USING purchases p
  ON p.title = b.title and p.type = 'bk'
  WHEN MATCHED THEN
    UPDATE SET b.desc = b.desc || '; ' || p.desc
  WHEN NOT MATCHED THEN
    INSERT (title, desc, bought) values (p.title, p.desc, p.bought)
          
MERGE INTO customers c
  USING (SELECT * from customers_delta WHERE id > 10) cd
  ON (c.id = cd.id)
  WHEN MATCHED THEN
    UPDATE SET name = cd.name
  WHEN NOT MATCHED THEN
    INSERT (id, name) values (cd.id, cd.name)
          
MERGE INTO numbers
USING (
  WITH RECURSIVE r(n) AS (
    SELECT 1 FROM rdb$database
    UNION ALL
    SELECT n+1 FROM r WHERE n < 200
  )
  SELECT n FROM r
) t
ON numbers.num = t.n
WHEN NOT MATCHED THEN
  INSERT(num) VALUES(t.n);
          

Das Problem mit dem „instabilen Cursor

Aufgrund der Art und Weise, in der die Ausführung der datenverändernden DML in Firebird bis einschließlich dieser Version implementiert wird, führen die für das Zusammenführen ausgewählten Sets manchmal zu unerwarteten Ergebnissen. Für weitere Informationen vergleichen Sie auch Das Problem mit dem „instabilen Cursor im Abschnitt UPDATE.

Zurück: DELETEFirebird Documentation IndexNach oben: Statements der Data Manipulation Language (DML)Weiter: EXECUTE PROCEDURE
Firebird Documentation IndexFirebird 2.5 SprachreferenzStatements der Data Manipulation Language (DML) → MERGE