SQL Anywhere は、DML 文 (INSERT、UPDATE、DELETE、または MERGE) をクエリの FROM 句内のテーブル式として使用することをサポートします。
文に dml-derived-table を含めると、DESCRIBE では無視されます。OPEN 時には、UPDATE 文が最初に実行され、結果がテンポラリテーブルに格納されます。テンポラリテーブルでは、文によって変更されるテーブルのカラム名が使用されます。変更された値は、REFERENCING 句の相関名を使用して参照できます。OLD または FINAL を指定することによって、クエリで参照される更新されたテーブルに、一連のユニークなカラム名を指定する必要がなくなります。dml-derived-table 文は更新可能なテーブルを 1 つのみ参照できます。複数のテーブルに対する更新の場合は、エラーが返されます。
たとえば、次のクエリでは、UPDATE 文に対して SELECT を使用し、以下にリストする操作を実行します。
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; |
次のクエリは、MERGE 文と UPDATE 文の両方を使用しています。modified_employees テーブルは、ステータスが変更された従業員のコレクションを表しています。MERGE 文では、給与が 3% 上がった従業員と modified_employees テーブルに含まれている従業員の従業員 ID と名前をマージしています。このクエリで OPTION 句に指定されているオプション設定は、UPDATE 文と MERGE 文の両方に適用されます。
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 ); |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |