SAP SQL Anywhere における SELECT文内でのUPDATE文の使用 (続)

 

この記事のオリジナルは、Glenn Paulley が sybase.com に 2010 年 1 月に掲載したものです。その中で、Glenn は SQL Anywhere の version 12 で追加された機能である、様々なDML クエリに対する SELECT 文の使用について継続して解説しています。

 

 

 

以前掲載した ブログ記事において、SQL Anywhere 12 サーバーから実装された新しい SQL 言語の機能である dml-derived-table からの行の SELECT 方法例を紹介しました。

今回は、アプリケーションをシンプルにする -derived-tables のその他の方法について簡単に紹介したいと思います。

まず最初に、このブログのタイトルは「SELECT 文内での UPDATE 文の使用」ですが、dml-derived-tables は、派生テーブルであるため、もちろん、DML 文 (INSERT, MERGE, DELETE, UPDATE) を含む派生テーブルを使用するようなあらゆるコンテキストに使用することができます。

その結果として、他の中の  1つの UPDATE 文を効果的に「入れ子」にすることができます。

以下は、UPDATE との組み合わせで MERGE を使用している例です。

 

  1. CREATE TABLE modified_employees
  2. ( EmployeeID INTEGER PRIMARY KEY, Surname VARCHAR(40), GivenName VARCHAR(40) )

 

  1. MERGE INTO modified_employees AS me
  2. USING (SELECT modified_employees.EmployeeID,
  3.               modified_employees.Surname,
  4.               modified_employees.GivenName
  5.       FROM (
  6.           UPDATE Employees
  7.           SET Salary = Salary * 1.03
  8.           WHERE ManagerID = 501)
  9.             REFERENCING (FINAL as modified_employees) ) AS dt_e
  10.       on dt_e.EmployeeID = me.EmployeeID
  11. WHEN MATCHED THEN SKIP
  12. WHEN NOT MATCHED THEN INSERT
  13. OPTION(optimization_level=1, isolation_level=2)

 

上の例では、テーブル 「modified_employees」 は、情報が変更されている Employee の集まりをモデル化します。上記の MERGE 文は、salary が 3%増加した社員の名前と EmployeeIDを、既に「modified_employees」テーブルに存在する社員データに merge します。

2つ目に、上の13 行目の OPTION 句に注目してください。この文で OPTION 句を使用して一時的に設定されているオプション設定は外側の MERGE だけではなく、入れ子となっている UPDATE 文にも適用されます。

3つ目に、dml-derived-table は、単に派生テーブルなので、複数の dml-derived-tablescan が同じ SQL 文内に存在します。

 

 

続きはこちら:SQL Anywhere における SELECT文内でのUPDATE文の使用 (続)

 

SAPのSAP SQL Anywhere製品ページはこちら