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

SQL Anywhere 12.0.0 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询和修改数据 » 查询数据 » FROM 子句:指定表

 

对 DML 语句执行 SELECT

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 );
 在查询中使用多个表
 在不实现结果的情况下使用表
 另请参见