SQL Anywhere unterstützt die Verwendung einer DML-Anweisung (INSERT, UPDATE, DELETE oder MERGE) als Tabellenausdruck in der FROM-Klausel einer Abfrage.
Wenn Sie einen dml-derived-table in einer Anweisung verwenden, wird dieser während des DESCRIBE ignoriert. Zum Zeitpunkt von OPEN wird zunächst die UPDATE-Anweisung ausgeführt und die Ergebnisse werden in einer temporären Tabelle gespeichert. Die temporäre Tabelle verwendet die Spaltennamen der Tabelle, die von der Anweisung geändert wird. Sie können auf die geänderten Werte mit dem Korrelationsnamen aus der REFERENCING-Klausel verweisen. Bei der Angabe von OLD oder FINAL brauchen Sie keine eindeutigen Spaltennamen für die aktualisierte Tabelle, die in der Abfrage referenziert wird. Die dml-derived-table-Anweisung kann nur eine einzelne aktualisierbare Tabelle referenzieren. Aktualisierungen mehrerer Tabellen geben einen Fehler zurück.
Die folgende Abfrage verwendet z.B. eine SELECT-Anweisung über eine UPDATE-Anweisung zum Ausführen der unten aufgelisteten Vorgänge:
SELECT old_products.ID, old_products.name, old_products.UnitPrice AS OldPrice, final_products.UnitPrice AS NewPrice, SOI.ID AS OrderID, SOI.Quantity FROM ( UPDATE Products SET UnitPrice = UnitPrice * 1.07 ) REFERENCING ( OLD AS old_products FINAL AS final_products ) JOIN SalesOrderItems AS SOI ON SOI.ProductID = old_products.ID WHERE SOI.ShipDate BETWEEN '2000-04-10' AND '2000-05-21' AND SOI.QUANTITY > 36 ORDER BY old_products.ID; |
Die folgende Abfrage verwendet eine MERGE-Anweisung und eine UPDATE-Anweisung. Die Tabelle "modified_employees" repräsentiert eine Sammlung von Mitarbeitern, deren Status geändert wurde, während die MERGE-Anweisung die Bezeichner und Namen der Mitarbeiter, deren Gehalt um 3 % erhöht wurde, mit Mitarbeitern zusammenführt, die in der Tabelle "modified_employees" enthalten sind. In dieser Abfrage beziehen sich die Optionseinstellungen, die in der OPTION-Klausel angegeben sind, sowohl auf die UPDATE- als auch auf die MERGE-Anweisung.
CREATE TABLE modified_employees ( EmployeeID INTEGER PRIMARY KEY, Surname VARCHAR(40), GivenName VARCHAR(40) ); MERGE INTO modified_employees AS me USING (SELECT modified_employees.EmployeeID, modified_employees.Surname, modified_employees.GivenName FROM ( UPDATE Employees SET Salary = Salary * 1.03 WHERE ManagerID = 501) REFERENCING (FINAL AS modified_employees) ) AS dt_e ON dt_e.EmployeeID = me.EmployeeID WHEN MATCHED THEN SKIP WHEN NOT MATCHED THEN INSERT OPTION( optimization_level=1, isolation_level=2 ); |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |