SQL Anywhere 支持将 DML 语句(INSERT、UPDATE、DELETE 或 MERGE)作为在查询的 FROM 子句中的表表达式。
某个语句中包含 dml-derived-table 时,在执行 DESCRIBE 时将忽略该派生表。在 OPEN 期间,首先执行 UPDATE 语句,并且将结果存储在临时表中。临时表使用正在由该语句修改的表中的列名。可使用 REFERENCING 子句中的相关名来引用已修改的值。通过指定 OLD 或 FINAL,您无需为在查询中引用的更新表指定一组唯一列名。dml-derived-table 语句仅引用一个可更新表;对多个表进行更新将返回一个错误。
例如,以下查询对 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_prodcuts.ID; |
以下查询同时使用了 MERGE 语句和 UPDATE 语句。其中,modified_employees 表表示状态已变更的雇员集合,而 MERGE 语句将薪水已提高 3% 的雇员的标识符和名称与 modified_employees 表中包含的雇员的标识符和名称合并到一起。在本查询中,在 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 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |