Führt Tabellen, Ansichten und Prozedurergebnisse in einer Tabelle oder Ansicht zusammen.
MERGE INTO target-object [ into-column-list ] USING [ WITH AUTO NAME ] source-object ON merge-search-condition merge-operation [...] [ OPTION ( query-hint, ... ) ]
target-object : [ userid.]target-table-name [ [ AS ] target-correlation-name ] | [ userid.]target-view-name [ [ AS ] target-correlation-name ] | ( select-statement ) [ AS ] target-correlation-name
source-object : [ userid.]source-table-name [ [ AS ] source-correlation-name ] [ WITH ( table-hints ) ] | [ userid.]source-view-name [ [ AS ] source-correlation-name ] | [ userid.]source-mat-view-name [ [ AS ] source-correlation-name ] | ( select-statement ) [ AS ] source-correlation-name [ using-column-list ] | procedure
procedure : [ owner.]procedure-name ( procedure-syntax ) [ WITH ( column-name data-type, ... ) ] [ [ AS ] source-correlation-name ]
merge-search-condition :
search-condition
| PRIMARY KEY
merge-operation : WHEN MATCHED [ AND search-condition ] THEN match-action | WHEN NOT MATCHED [ AND search-condition ] THEN not-match-action
match-action : DELETE | RAISERROR [ error-number ] | SKIP | UPDATE SET set-item, ... | UPDATE [ DEFAULTS { ON | OFF } ]
not-match-action : INSERT | INSERT [ insert-column-list ] VALUES ( value, ... ) | RAISERROR [ error-number ] | SKIP
set-item : [target-correlation-name.]column-name = { expression | DEFAULT } | [ owner-name.]target-table-name.column-name = { expression | DEFAULT }
insert-column-list : ( column-name, ... )
query-hint : MATERIALIZED VIEW OPTIMIZATION option-value | FORCE OPTIMIZATION | option-name = option-value
into-column-list : ( column-name, ... )
using-column-list : ( column-name, ... )
error-number: positive Ganzzahl oder Variable über 17000
option-name : Bezeichner
option-value : hostvar (Bezeichner zulässig) | string | identifier | number
table-hints: Siehe FROM-Klausel.
search-condition : Siehe Suchbedingungen.
set-clause-list: Siehe SET-Anweisung.
INTO-Klausel Verwenden Sie diese Klausel, um das Zielobjekt für die MERGE-Anweisung zu definieren. target-object kann der Name einer Basistabelle, einer normalen Ansicht oder einer abgeleiteten Tabelle sein, nicht aber einer materialisierten Ansicht. Die abgeleitete Tabelle oder Ansicht muss einen aktualisierbaren Abfrageblock darstellen. Beispiel: Wenn die Definition der Ansicht oder abgeleiteten Tabelle UNION, INTERSECT, EXCEPT oder GROUP BY enthält, kann sie nicht als Zielobjekt für die MERGE-Anweisung benutzt werden.
Wenn target-object eine abgeleitete Tabelle ist, kann die optionale into-column-list verwendet werden, um andere Namen für die Spalte der abgeleiteten Tabellen anzugeben. Wenn sie auf diese Art verwendet wird, muss die into-column-list eine Größe haben, die zur Spaltenliste der abgeleiteten Tabelle passt. Außerdem muss die Sortierung der beiden Tabellen gleich sein.
Wenn target-object eine Basistabelle oder Ansicht ist, kann into-column-list verwendet werden, um eine Teilmenge der Spalten der Tabelle oder Ansicht anzugeben, die für den Rest der MERGE-Anweisung relevant sind.
Der Datenbankserver benutzt into-column-list für folgende Auflösungen:
UPDATE ohne SET-Klausel in WHEN MATCHED-Klausel.
INSERT ohne VALUES-Klausel in einer WHEN NOT MATCHED-Klausel
PRIMARY KEY-Suchbedingung in der ON-Klausel.
WITH AUTO NAME-Klausel in der USING-Klausel
Wenn Sie die into-column-list nicht angeben, wird angenommen, dass die into-column-list alle Spalten des target-object enthält.
USING-Klausel Verwenden Sie diese Klausel, um die Quelle der Daten für die Zusammenführung festzulegen. source-object kann eine Basistabelle (einschließlich Tabellen-Hints), eine Ansicht, eine materialisierte Ansicht, eine abgeleitete Tabelle oder eine Prozedur sein. Wenn source-object eine abgeleitete Tabelle ist, können Sie eine using-column-list angeben. Alle Spalten des source-object werden verwendet, wenn Sie nicht eine using-column-list angeben.
WITH AUTO NAME-Klausel Verwenden Sie diese Klausel, damit der Server automatisch Spaltennamen für die Übereinstimmung der Spalten in der into-column-list mit den Spalten im target-object für den Zusammenführungsvorgang benutzt. Die folgenden Beispiele sind gleichwertig und zeigen, dass die Reihenfolge der Spalten in der into-column-list geändert wird, damit eine Übereinstimmung mit den Namen der Spalten im source-object erzielt wird, wenn WITH AUTO NAME angegeben ist:
... INTO T ( Name, ID, Description ) USING WITH AUTO NAME ( SELECT Description, Name, ID FROM PRODUCTS WHERE Description LIKE '%cap%') ... INTO T ( Description, Name, ID ) USING ( SELECT Description, Name, ID FROM PRODUCTS WHERE Description LIKE '%cap%' ) |
ON-Klausel Verwenden Sie diese Klausel, um die Bedingung für die Übereinstimmung einer Zeile im source-object mit Zeilen im target-object anzugeben.
Sie können ON PRIMARY KEY angeben, um eine Übereinstimmung von source-object-Zeilen basierend auf der Primärschlüsseldefinition des target-object zu erzielen. source-object benötigt keinen Primärschlüssel. target-object muss hingegen einen Primärschlüssel haben. Wenn Sie ON PRIMARY KEY angeben:
Ein Fehler wird zurückgegeben, wenn target-object keine Basistabelle ist oder keinen Primärschlüssel hat.
Ein Fehler wird zurückgegeben, wenn mindestens ein Primärschlüssel in der into-column-list nicht enthalten ist.
Die Anzahl der Spalten in into-column-list und using-column-list kann verschieden sein, wenn jede Primärschlüsselspalte in into-column-list eine passende Spalte in using-column-list hat. Beispiel: Wenn into-column-list (I1, I2, I3) enthält, using-column-list (U1, U2) enthält und die Primärschlüsselspalten (I2, I3) sind, wird ein Fehler zurückgegeben, weil Spalte (I3) des target-object-Primärschlüssels keine Übereinstimmung in using-column-list hat.
Unbeschadet der Definition des Primärschlüssels basiert die Übereinstimmung der Primärschlüsselspalten in into-column-list mit Ausdrücken in using-column-list auf der Position der Primärschlüsselspalten in into-column-list. Beispiel: Angenommen, der Primärschlüssel für target-object ist definiert als (B, C) und into-column-list ist (E, C, F, A, D, B). Wenn ON PRIMARY KEY angegeben ist, wird target-object Spalte B mit dem sechsten Element anhand von using-column-list verglichen, weil Spalte B an der sechsten Stelle von into-column-list steht. Ebenso gilt: Spalte C von target-object wird mit dem zweiten Element von using-column-list verglichen.
ON PRIMARY KEY ist eine syntaktische Kurzform für eine entsprechende ON-Bedingung. Beispiel: Angenommen, into-column-list ist (I1, I2, .. In) und die entsprechend übereinstimmende Spaltenliste using-column-list ist (U1, U2, .. Um). Außerdem wird angenommen, dass die Primärschlüsselspalten von target-object I1, I2, I3 sind und alle Primärschlüsselspalten in into-column-list enthalten sind. In diesem Fall wird merge-search-condition als "I1=U1 AND I2=U2 AND I3=U3"
-Konjunkt definiert.
WHEN MATCHED- und WHEN NOT MATCHED-Klauseln Verwenden Sie die WHEN MATCHED- und WHEN NOT MATCHED-Klauseln, um eine Aktion zu definieren, wenn eine Zeile aus source-object mit einer Zeile in target-object übereinstimmt oder nicht übereinstimmt. Die Aktion wird nach dem THEN-Schlüsselwort definiert. Sie können die Aktionen für Teilmengen von übereinstimmenden oder nicht übereinstimmenden Zeilen steuern, indem Sie eine zusätzliche AND-Klausel eingeben.
Die ON-Klausel legt fest, wie Zeilen aus source-object in übereinstimmenden und nicht übereinstimmenden Zeilen aufgeteilt werden. Eine Zeile in source-object wird als übereinstimmende Zeile angesehen, wenn die ON-Klausel für mindestens eine Zeile in target-object TRUE ist. Eine Zeile in source-object wird als nicht übereinstimmende Zeile angesehen, wenn die ON-Klausel für eine Zeile in target-object nicht TRUE ist. Verwenden Sie WHEN MATCHED- und WHEN NOT MATCHED-Klauseln, um übereinstimmende und nicht übereinstimmende Zeilen in getrennte Teilmengen zu zerlegen. Jede Teilmenge wird über eine WHEN-Klausel verarbeitet. WHEN MATCHED- und WHEN NOT MATCHED-Klauseln werden in der Reihenfolge abgearbeitet, in der sie in der MERGE-Anweisung erscheinen.
Die in der AND-Klausel einer WHEN MATCHED- oder WHEN NOT MATCHED-Klausel angegebene Suchbedingung legt fest, ob eine in Frage kommende Zeile durch eine spezielle Klausel verarbeitet wird. Wenn Sie eine WHEN MATCHED- oder WHEN NOT MATCHED-Klausel ohne die AND-Klausel angeben, wird die Suchbedingung in der AND-Klausel als TRUE angenommen. Wenn eine Zeile der AND-Bedingung für mehr als eine Klausel entspricht, wird die Zeile von der Klausel verarbeitet, die in der MERGE-Anweisung zuerst kommt.
Ein Fehler wird zurückgegeben, wenn eine der WHEN MATCHED-Klauseln dieselbe target-object-Zeile mehr als einmal verarbeitet. Eine target-object-Zeile kann mehr als einmal zu derselben Teilmenge derselben WHEN MATCHED-Klausel gehören, wenn sie mit zwei unterschiedlichen Eingabezeilen aus source-object übereinstimmt.
Im folgenden Beispiel wird ein Fehler zurückgegeben, weil die Zeile mit ID 300 aus target-object Products mit 111 Zeilen in source-object von SalesOrderItems übereinstimmt. Alle Übereinstimmungen gehören entsprechend der WHEN MATCHED THEN UPDATE-Klausel zu derselben Teilmenge.
MERGE INTO Products USING SalesOrderItems S ON S.ProductID = Products.ID WHEN MATCHED THEN UPDATE SET Products.Quantity = 20; |
WHEN MATCHED: Bei einer übereinstimmenden Zeile können Sie eine der folgenden Aktionen für match-action festlegen:
DELETE Geben Sie DELETE an, um die Zeile aus target-object zu löschen.
RAISERROR Geben Sie RAISERROR an, um den Zusammenführungsvorgang zu beenden, Änderungen zurückzusetzen und eine Fehlermeldung zurückzugeben. Standardmäßig gilt: Wenn Sie RAISERROR angeben, gibt der Datenbankserver SQLSTATE 23510 und SQLCODE -1254 zurück.
Optional können Sie den zurückgegebenen SQLCODE anpassen, indem Sie den error-number-Parameter nach dem RAISERROR-Schlüsselwort angeben. Der benutzerdefinierte SQLCODE muss eine positive Ganzzahl größer als 17.000 sein und kann entweder als Zahl oder als Variable angegeben werden. Wenn Sie einen benutzerdefinierten SQLCODE angeben, ist die zurückgegebene Nummer negativ.
Beispiel: Wenn Sie WHEN MATCHED AND search-condition THEN RAISERROR 17001
angeben und eine Zeile gefunden wird, die den Bedingungen der WHEN-Klausel entspricht, schlägt der MERGE-Vorgang fehl, die
Änderungen werden zurückgesetzt und der zurückgegebene Fehler hat die Nummern SQLSTATE 23510 und SQLCODE -17001.
SKIP Geben Sie SKIP an, um die Zeile zu überspringen. Es findet keine Aktion statt.
UPDATE Geben Sie UPDATE SET an, um die Zeile mit den Werten in set-item zu aktualisieren. set-item ist ein einfacher Zuordnungsausdruck, in dem eine Spalte auf den Wert von expression gesetzt wird. Es gibt keine Einschränkungen für expression. Sie können auch DEFAULT angeben, um die Spalte auf den für sie definierten Standardwert zu setzen.
Beispiel: UPDATE SET target-column1=DEFAULT, target-column2=source-column2
setzt target-column1 auf ihren Standardwert und target-column2 auf denselben Wert wie die Änderungszeile aus source-column2
in source-object.
Wenn Sie die SET-Klausel nicht angeben, wird die SET-Klausel durch into-column-list und using-column-list definiert. Beispiel: Wenn die into-column-list (I1, I2, .. In) und die using-column-list (U1, U2, .. Un) ist, wird die SET-Klausel als "SET I1=U1 , I2=U2 , .. In=Un"
angenommen.
WHEN NOT MATCHED: Bei einer nicht übereinstimmenden Zeile können Sie eine der folgenden Aktionen für non-match-action festlegen:
INSERT
Geben Sie INSERT...VALUES an, um die Zeile mit den angegebenen Werten einzufügen. Wenn Sie die INSERT-Klausel ohne
VALUES-Klausel angeben, wird die VALUES-Klausel durch into-column-list und using-column-list definiert. Beispiel: Wenn die into-column-list (I1, I2, .. In) und die using-column-list (U1, U2, .. Un) ist, entspricht INSERT ohne eine VALUES-Klausel INSERT (I1, I2, .. In) VALUES (U1, U2, .. Un)
.
RAISERROR Geben Sie RAISERROR an, um den Zusammenführungsvorgang zu beenden, Änderungen zurückzusetzen und eine Fehlermeldung zurückzugeben. Wenn Sie RAISERROR angeben, gibt der Datenbankserver standardmäßig SQLSTATE 23510 und SQLCODE -1254 zurück. Optional können Sie den zurückgegebenen SQLCODE anpassen, indem Sie den error-number-Parameter nach dem RAISERROR-Schlüsselwort angeben. Der benutzerdefinierte SQLCODE muss eine positive Ganzzahl größer als 17.000 sein und kann entweder als Zahl oder als Variable angegeben werden. Wenn Sie einen benutzerdefinierten SQLCODE angeben, ist die zurückgegebene Nummer negativ.
Beispiel: Wenn Sie WHEN NOT MATCHED AND search-condition THEN RAISERROR 17001
angeben und eine Zeile gefunden wird, die den Bedingungen der WHEN-Klausel entspricht, schlägt der MERGE-Vorgang fehl, die
Änderungen werden zurückgesetzt und der zurückgegebene Fehler hat die Nummern SQLSTATE 23510 und SQLCODE -17001.
SKIP Geben Sie SKIP an, um die Zeile zu überspringen. Es findet keine Aktion statt.
OPTION-Klausel Verwenden Sie diese Klausel, um Hints für das Ausführen der Anweisung anzugeben. Die folgenden Hints werden unterstützt:
OPTION( isolation_level = ... )
im Abfragetext Vorrang vor allen anderen Festlegungeen der Isolationsstufe für eine Abfrage hat.
Zeilen im source-object werden mit Zeilen im target-object verglichen und als übereinstimmend oder nicht übereinstimmend befunden, je nachdem ob sie den Bedingungen in der ON-Klausel entsprechen oder nicht. Zeilen in source-object werden als übereinstimmend angesehen, wenn es zumindest eine Zeile in der Zieltabelle target-table gibt, sodass die Suchbedingung für die Zusammenführung (merge-search-condition) als TRUE ausgewertet wird. Übereinstimmende Zeilen und nicht übereinstimmende Zeilen werden dann nach den Aktionen gruppiert, die für sie in den Klauseln WHEN MATCHED und WHEN NOT MATCHED gemäß den durch die AND-Klauseln festgelegten Suchbedingungen festgelegt wurden. Das Gruppieren nach Aktionen für übereinstimmende und nicht übereinstimmende Zeilen wird als Verzweigen bezeichnet und die einzelnen Gruppen werden Verzweigung genannt.
Nachdem das Verzweigen abgeschlossen ist, beginnt die Datenbank mit dem Ausführen der Aktion, die für die Zeilen der Verzweigung definiert wurden. Die Verzweigungen werden in der Reihenfolge verarbeitet, in der sie auftreten, und dies entspricht der Reihenfolge, in der die WHEN-Klauseln in der Anweisung enthalten sind. Wenn während des Verzweigens mehr als eine Zeile im source-object eine Aktion hat, die für dieselbe Zeile im target-object definiert wurde, schlägt der MERGE-Vorgang fehl und eine Fehlermeldung wird zurückgegeben. Damit wird verhindert, dass der MERGE-Vorgang mehr als eine Aktion für eine Zeile im target-object ausführt.
Während der Verarbeitung der Verzweigungen werden die Einfüge-, Aktualisierungs- und Löschaktionen im Transaktionslog wie die entsprechenden INSERT-, UPDATE- und DELETE-Anweisungen gespeichert.
DBA-Berechtigung oder:
INSERT-, UPDATE- und DELETE-Berechtigungen für das target-object, wenn die INSERT-, UPDATE- oder DELETE-Aktion in der MERGE-Anweisung angegeben ist.
SELECT-Berechtigung ist für jedes Objekt erforderlich, das in der MERGE-Anweisung referenziert wird.
EXECUTE-Berechtigung ist für jede Prozedur erforderlich, die in der MERGE-Anweisung referenziert wird.
Trigger, die für das target-object definiert wurden, werden ausgelöst.
SQL/2008 Die MERGE-Anweisung umfasst die Funktionen F312 und F313 des SQL/2008-Standards. Die MERGE-Anweisung in SQL Anywhere entspricht der Spezifikation für die MERGE-Anweisung im SQL/2008-Standard und enthält Erweiterungen. Zu den SQL Anywhere-spezifischen Erweiterungen für die MERGE-Anweisung gehören:
DELETE in einer WHEN MATCHED-Klausel.
RAISERROR in einer WHEN [NOT] MATCHED-Klausel.
SKIP in einer WHEN [NOT] MATCHED-Klausel
OPTION-Klausel
PRIMARY KEY-Klausel
DEFAULTS-Klausel
INSERT-Klausel ohne VALUES-Klausel.
WITH AUTO NAME-Klausel
UPDATE-Klausel ohne SET-Klausel.
Im folgenden Beispiel wird eine Zeile aus einer abgeleiteten Tabelle in die Products-Tabelle zusammengeführt, wobei ein neues T-Shirt mit denselben Attributen wie ein vorhandenes T-Shirt, aber mit neuer Farbe, Menge und Produktbezeichner hinzugefügt wird. In diesem Beispiel gilt: Wenn das Produkt mit der Identifizierungsnummer 304 in der Products-Tabelle bereits existiert, wird die Zeile nicht eingefügt:
MERGE INTO Products ( ID, Name, Description, Size, Color, Quantity, UnitPrice, Photo ) USING WITH AUTO NAME ( SELECT 304 AS ID, 'Purple' AS Color, 100 AS Quantity, Name, Description, Size, UnitPrice, Photo FROM Products WHERE Products.ID = 300 ) AS DT ON PRIMARY KEY WHEN NOT MATCHED THEN INSERT; |
Das folgende Beispiel entspricht dem vorherigen, benutzt aber keine syntaktische Kurzform:
MERGE INTO Products ( ID, Name, Description, Size, Color, Quantity, UnitPrice, Photo ) USING ( SELECT 304 AS ID, 'Purple' AS Color, 100 AS Quantity, Name, Description, Size, UnitPrice, Photo FROM Products WHERE Products.ID = 300 ) AS DT ( ID, Name, Description, Size, Color, Quantity, UnitPrice, Photo ) ON ( Products.ID = DT.ID ) WHEN NOT MATCHED THEN INSERT ( ID, Name, Description, Size, Color, Quantity, UnitPrice, Photo ) VALUES ( DT.ID, DT.Name, DT.Description, DT.Size, DT.Color, DT.Quantity, DT.UnitPrice, DT.Photo ); |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |