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

SAP Sybase SQL Anywhere 16.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 文は更新可能なテーブルを 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 );
 クエリでの複数テーブルの使用
 結果の実体化を伴わないテーブルの使用
 参照