Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Referenzhandbuch » Verwendung von SQL » SQL-Anweisungen » SQL-Anweisungen (E-O)

 

MERGE-Anweisung

Verwenden Sie diese Anwendung, um Tabellen, Ansichten und Systemprozedurergebnisse in einer Tabelle oder View zusammenzuführen.

Syntax
MERGE
INTO Zielobjekt [ Into-Spaltenliste ]
USING [ WITH AUTO NAME ] Quellobjekt
   ON Zusammenführungs-Suchbedingung
Zusammenführungsvorgang […]
 [ OPTION ( Abfragen-Hint, ... ) ]
Zielobjekt: 
[ Benutzer-ID.]Zieltabellenname [ [ AS ] Zielkorrelationsname ]  
| [ Benutzer-ID.]Zielansichtsname [ [ AS ] Zielkorrelationsname ] 
| ( Select-Anweisung ) [ AS ] Zielkorrelationsname 
Quellobjekt : 
[ Benutzer-ID.]Quelltabellenname [ [ AS ] Quellkorrelationsname ] [ WITH ( Tabellen-Hints ) ]
| [ Benutzer-ID.]Quellansichtsname [ [ AS ] Quellkorrelationsname ] 
| [ Benutzer-ID.]Quell-Mat.-Ansichtsname [ [ AS ] Quellkorrelationsname ] 
| ( Select-Anweisung ) [ AS ] Quellkorrelationsname [  Using-Spaltenliste  ]
| Prozedur
Prozedur :
[ Eigentümer.]Prozedurname ( Prozedursyntax )
   [ WITH ( Spaltenname Datentyp, ... ) ]
   [ [ AS ] Quellkorrelationsname ]
Zusammenführungs-Suchbedingung :
Suchbedingung
| PRIMARY KEY
Zusammenführungsvorgang :
WHEN MATCHED [ AND Suchbedingung ] THEN Übereinstimmungsaktion
| WHEN NOT MATCHED [ AND Suchbedingung ] THEN Nichtübereinstimmungsaktion
Übereinstimmungsaktion :
DELETE
| RAISERROR [ Fehlernummer ]
| SKIP 
| UPDATE SET Mengenelement, ...  
| UPDATE [ DEFAULTS { ON | OFF } ]
Nichtübereinstimmungsaktion :
INSERT 
| INSERT [ Insert-Spaltenliste ] VALUES ( Wert, ... ) 
| RAISERROR [ Fehlernummer ]
| SKIP
Mengenelement :
[Zielkorrelationsname.]Spaltenname = { Ausdruck | DEFAULT }
| [Eigentümername.]Zieltabellenname.Spaltenname = { Ausdruck | DEFAULT }
Insert-Spaltenliste : 
( Spaltenname, ... )
Abfragen-Hint :
MATERIALIZED VIEW OPTIMIZATION Optionswert
| FORCE OPTIMIZATION
| Optionsname = Optionswert
Into-Spaltenliste :
( Spaltenname, ... )
Using-Spaltenliste :
( Spaltenname, ... )
Fehlernummer: positive Ganzzahl oder Variable über 17000
Optionsname : Bezeichner
Optionswert: Hostvariable (Indikator zulässig), Zeichenfolge, Bezeichner oder Zahl

Tabellen-Hints: Weitere Hinweise finden Sie unter FROM-Klausel.

Suchbedingung: Weitere Hinweise finden Sie unterSuchbedingungen.

SET-Klauselliste: Weitere Hinweise finden Sie unter SET-Anweisung.

Parameter
  • INTO-Klausel   Verwenden Sie diese Klausel, um das Zielobjekt für die MERGE-Anweisung zu definieren. Zielobjekt 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 Zielobjekt eine abgeleitete Tabelle ist, kann die optionale Into-Spaltenliste verwendet werden, um andere Namen für die Spalte der abgeleiteten Tabellen anzugeben. Wenn sie auf diese Art verwendet wird, muss die Into-Spaltenliste eine Größe haben, die zur Spaltenliste der abgeleiteten Tabelle passt. Außerdem muss die Sortierung der beiden Tabellen gleich sein.

    Wenn Zielobjekt eine Basistabelle oder Ansicht ist, kann Into-Spaltenliste 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-Spaltenliste 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-Spaltenliste nicht angeben, wird angenommen, dass die Into-Spaltenliste alle Spalten des Zielobjekts enthält.

  • USING-Klausel   Verwenden Sie diese Klausel, um die Quelle der Daten für die Zusammenführung festzulegen. Quellobjekt kann eine Basistabelle (einschließlich Tabellen-Hints), eine Ansicht, eine materialisierte Ansicht, eine abgeleitete Tabelle oder eine Prozedur sein. Wenn Quellobjekt eine abgeleitete Tabelle ist, können Sie eine Using-Spaltenliste angeben. Alle Spalten des Quellobjekts werden verwendet, wenn Sie nicht eine Using-Spaltenliste angeben.

  • WITH AUTO NAME-Klausel   Verwenden Sie diese Klausel, damit der Server automatisch Spaltennamen für die Übereinstimmung der Spalten in der Into-Spaltenliste mit den Spalten im Zielobjekt für den Zusammenführungsvorgang benutzt. Die folgenden Beispiele sind gleichwertig und zeigen, dass die Reihenfolge der Spalten in der Into-Spaltenliste geändert wird, damit eine Übereinstimmung mit den Namen der Spalten im Quellobjekt 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 Quellobjekt mit Zeilen im Zielobjekt anzugeben.

    Weitere Hinweise zur Suchbedingungssyntax finden Sie unter Suchbedingungen.

    Sie können ON PRIMARY KEY angeben, um eine Übereinstimmung von Quellobjekt-Zeilen basierend auf der Primärschlüsseldefinition des Zielobjekts zu erzielen. Quellobjekt benötigt keinen Primärschlüssel. Zielobjekt muss hingegen einen Primärschlüssel haben. Wenn Sie ON PRIMARY KEY angeben:

    • Ein Fehler wird zurückgegeben, wenn Zielobjekt keine Basistabelle ist oder keinen Primärschlüssel hat.

    • Ein Fehler wird zurückgegeben, wenn mindestens ein Primärschlüssel in der Into-Spaltenliste nicht enthalten ist.

    • Die Anzahl der Spalten in der Into-Spaltenliste und der Using-Spaltenliste kann verschieden sein, wenn jede Primärschlüsselspalte in der Into-Spaltenliste eine passende Spalte in der Using-Spaltenliste hat. Beispiel: Wenn die Into-Spaltenliste (I1, I2, I3) enthält, die Using-Spaltenliste (U1, U2) enthält und die Primärschlüsselspalten (I2, I3) sind, wird ein Fehler zurückgegeben, weil Spalte (I3) des Zielobjekt-Primärschlüssels keine Übereinstimmung in der Using-Spaltenliste hat.

    • Unbeschadet der Definition des Primärschlüssels basiert die Übereinstimmung der Primärschlüsselspalten in der Into-Spaltenliste mit Ausdrücken in der Using-Spaltenliste auf der Position der Primärschlüsselspalten in der Into-Spaltenliste. Beispiel: Angenommen, der Primärschlüssel für das Zielobjekt ist definiert als (B, C) und die Into-Spaltenliste ist (E, C, F, A, D, B). Wenn ON PRIMARY KEY angegeben ist, wird Zielobjekt Spalte B mit dem sechsten Element anhand der Using-Spaltenliste verglichen, weil Spalte B an der sechsten Stelle der Into-Spaltenliste steht. Ebenso gilt: Spalte C des Zielobjekts wird mit dem zweiten Element der Using-Spaltenliste verglichen.

      ON PRIMARY KEY ist eine syntaktische Kurzform für eine entsprechende ON-Bedingung. Beispiel: Angenommen, die Into-Spaltenliste ist (I1, I2, .. In) und die entsprechende übereinstimmende Using-Spaltenliste ist (U1, U2, .. Um). Außerdem wird angenommen, dass die Primärschlüsselspalten des Zielobjekts I1, I2, I3 sind und alle Primärschlüsselspalten in der Into-Spaltenliste enthalten sind. In diesem Fall wird Merge-Suchbedingung 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 dem Quellobjekt mit einer Zeile im Zielobjekt ü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 dem Quellobjekt in übereinstimmenden und nicht übereinstimmenden Zeilen aufgeteilt werden. Eine Zeile im Quellobjekt wird als übereinstimmende Zeile angesehen, wenn die ON-Klausel für mindestens eine Zeile im Zielobjekt TRUE ist. Eine Zeile im Quellobjekt wird als nicht übereinstimmende Zeile angesehen, wenn die ON-Klausel für eine Zeile im Zielobjekt 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 Zielobjekt-Zeile mehr als einmal verarbeitet. Eine Zielobjekt-Zeile kann mehr als einmal zu derselben Teilmenge derselben WHEN MATCHED-Klausel gehören, wenn sie mit zwei unterschiedlichen Eingabezeilen aus dem Quellobjekt übereinstimmt.

    Im folgenden Beispiel wird ein Fehler zurückgegeben, weil die Zeile mit ID 300 aus dem Zielobjekt Products mit 111 Zeilen im Quellobjekt 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 die Übereinstimmungsaktion festlegen:

    • DELETE   Geben Sie DELETE an, um die Zeile aus dem Zielobjekt 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 Fehlernummer-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 Suchbedingung 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. Weitere Hinweise finden Sie unter Die RAISERROR-Aktion verwenden.

    • 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 Mengenelement zu aktualisieren. Mengenelement ist ein einfacher Zuordnungsausdruck, in dem eine Spalte auf den Wert von Ausdruck gesetzt wird. Es gibt keine Einschränkungen für Ausdruck. 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 stellt target-column1 auf ihren Standardwert und target-column2 auf denselben Wert wie die Änderungszeile aus source-column2 im Quellobjekt.

      Wenn Sie die SET-Klausel nicht angeben, wird die SET-Klausel durch die Into-Spaltenliste und die Using-Spaltenliste definiert. Beispiel: Wenn die Into-Spaltenliste (I1, I2, .. In) und die Using-Spaltenliste (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 die Nichtübereinstimmungsaktion 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 die Into-Spaltenliste und die Using-Spaltenliste definiert. Beispiel: Wenn die Into-Spaltenliste (I1, I2, .. In) und die Using-Spaltenliste (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 Fehlernummer-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 Suchbedingung 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. Weitere Hinweise finden Sie unter Die RAISERROR-Aktion verwenden.

    • 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:

    • MATERIALIZED VIEW OPTIMIZATION Optionswert
    • FORCE OPTIMIZATION
    • Optionsname = Optionswert

    Eine Beschreibung dieser Optionen finden Sie bei der OPTIONS-Klausel unter SELECT-Anweisung.

Bemerkungen

Zeilen im Quellobjekt werden mit Zeilen im Zielobjekt verglichen und als übereinstimmend oder nicht übereinstimmend befunden, je nachdem ob sie den Bedingungen in der ON-Klausel entsprechen oder nicht. Zeilen im Quellobjekt werden als übereinstimmend angesehen, wenn es zumindest eine Zeile in der Zieltabelle gibt, sodass die Zusammenführungs-Suchbedingung 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 Quellobjekt eine Aktion hat, die für dieselbe Zeile im Zielobjekt 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 Zielobjekt 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.

Hinweise zum Einfluss von Triggern auf Zusammenführungsvorgänge finden Sie unter Daten mit der MERGE-Anweisung importieren.

Berechtigungen

DBA-Berechtigung oder:

  • INSERT-, UPDATE- und DELETE-Berechtigungen für das Zielobjekt, 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.

Nebenwirkungen

Trigger, die für das Zielobjekt definiert wurden, werden ausgelöst.

Siehe auch
Standards und Kompatibilität
  • SQL/2003   Die MERGE-Anweisung ist Funktion F312 des SQL/2003-Standards. Die MERGE-Anweisung in SQL Anywhere entspricht der Spezifikation für die MERGE-Anweisung im SQL/2003-Standard und enthält Erweiterungen. Einige dieser Erweiterungen für die MERGE-Anweisung sind mit dem zukünftigen SQL/2008-Standard kompatibel. Es handelt sich dabei um die Folgenden:

    • Mehrere WHEN MATCHED- und WHEN NOT MATCHED-Klauseln.

    • [ AND Suchbedingung ] mit WHEN [NOT] MATCHED-Klauseln.

    • 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.

Beispiele

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 );

Detailliertere Beispiele für die MERGE-Anweisung finden Sie unter Daten mit der MERGE-Anweisung importieren.