Und was war am MERGE
mächtiger?
IST!
Bsp. aus der Firebird.Docs:
SQL-Code:
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)
Beim "UPDATE OR INSERT" werden IMMER entwerder INSERT oder UPDATE ausgeführt.
Dabei werden beim INSERT und UPDATE die GLEICHEN Felder eingefügt/geändert.
Beim Merge hat man die Möglichkeit beim Update andere Felder als beim Insert zu setzen. Und man kann eine von beiden Operationen wegzulassen.
Um wieder zu Thema "
SQL Update alle Einträge" zurückzukehren:
In diesem Fall, es fände nur der
..WHEN MATCHED THEN UPDATE SET ..
-Zweig
Verwendung,
..WHEN NOT MATCHED THEN INSERT ..
würde man weglassen.
Ein Geschwindigkeitsvorteil gegenüber einem einfachen "UPDATE .. SET = (Select.. From..)"
ergibt sich wenn mehrer Felder der Zieltabelle aus gleichzeitig geändert werden.
SQL-Code:
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,
FeldX = cd.ZZ,
FeldY = cd.TTT;