SAP SQL Anywhere における SELECT 文内での UPDATE 文の使用
この記事のオリジナルは、Glenn Paulley が sybase.com に 2009 年 5 月に掲載したものです。その中で、Glenn は SQL Anywhere version 12 で追加された機能である 様々な DML クエリーにおける SELECT文 の使用について解説しています。
これは非常に便利で、軽く使える機能なため、繰り返し使用する価値があります。
例えば、insert 文の一部として新たに挿入された行のプライマリーキーを簡単に返すことができます。
例:
- SELECT pkey_col FROM (INSERT INTO mytable(col2) VALUES( ‘hello’)) REFERENCING (FINAL as t_final) order by 1
2009 年 5 月のブログ記事で、クエリーの FROM 句
内のテーブル表現として update DML 文を使用できる IBM DB2 製品の SQL 言語機能について賞賛しましたが、DB2 の構文を以下の簡単な例で説明します。
- SELECT T_updated.*
- FROM NEW TABLE ( UPDATE T SET x=7 WHERE y=6 ) AS T_updated
- WHERE T_updated.pk IN ( SELECT S.fk FROM S WHERE S.z = 8 )
この構造は、修正した行を他のテーブルに join する、cursor 経由で修正した行をアプリケーションに返す、修正した行をファイルにアウトプットする、などをとても簡単に行うことができます。
この拡張機能がない場合は、AFTER
または BEFORE TRIGGER
を定義して修正された行を他の(異なる)テーブルにコピーし、その別のテーブルのコンテンツを管理し(そして既存の updaters をハンドリングし)、UPDATE
文が実行された後にトリガーが挿入されたテーブルに別の SELECT
文を実行する必要があります。
これは update 文が行った変更をアウトプットするだけにもかかわらず、かなりの労力を要します。
そのため、この言語機能が SQL Anywhere version 12 で利用可能になったことをたいへんうれしく思います。
構文とセマンティクス
SQL Anywhere 12 におけるこの機能の文法は以下のとおりです:
- <table primary> ::= <table or query name> [ [ AS ] <correlation name> [ ( <derived column list> ) ] ]
- | other forms of table references …
- | ( <dml derived table> ) REFERENCING <result option>
- <dml derived table> ::= <delete statement>
- | <insert statement>
- | <merge statement>
- | <update statement>
- <result option> ::= OLD [AS] <correlation name>
- | FINAL [AS] <correlation name>
- | OLD [AS] <correlation name> FINAL [AS] <correlation name>
この構文は、DB2 で提供されているものとは 2 つの点で大きく異なります。
まず第一に UPDATE
または MERGE
文から新しい値と古い値の比較を計算するアプリケーションにおいて、構文を簡潔にしたいという思いがありました。
そして第二に、同じリクエストにおいてdml-derived-table を他のオブジェクトに簡単に joinできるようにしたいと考えたからです。
dml-derived-table の構文は以下のとおりです。
続きはこちら: SAP SQL Anywhere における SELECT 文内での UPDATE 文の使用
SAPのSAP SQL Anywhere製品ページはこちら