SAP SQL Anywhere で MERGE 文を使用する
この記事のオリジナルは、Glenn Paulley が sybase.com に 2009 年 4 月に掲載したものです。その中で、Glenn は SQL Anywhere における MERGE 文について解説しています。MERGE 文に関する最新の情報はこちらを参照ください。
MERGE
文は、SQL:2003 ANSI/ISO の F312 の機能として登場しました。MERGE
は、行のセットを挿入する必要があり、かつ、クリーニングまたは他の ETL (Extract-Transform-Load) プロセスが必要な時に便利です。MERGE
を使用すると、1 つの文で新規データ挿入と既存の行の更新をセットで対応できる洗練されたロジックを実装することができます。
このブログ記事では、MERGE
文の機能について簡単に概要を説明するとともに、SQL:2003 と SQL:2008 間でどのような変更があったのか、さらに SQL Anywhere でサポートされている拡張機能について説明します。
ここでは、私の同僚である Anil Goel が 2008 年 8月にラスベガスで開催された Sybase Techwave においてプレゼンした MERGE
文とマテリアライズドビューに関する資料を借りて説明したいと思います。
例
テーブルに行を挿入する処理を行う場合、「INSERT
-else-UPDATE
」処理を実行する必要がある場合があります。これこそが、MERGE
文を使用する理由です。さらには以下のようなメリットがあります。
INSERT
の代替アクションを設定することができます。例えば
• 特定の行において条件次第で INSERT
をスキップ、または UPDATE
を行う
• 既存の行を DELETE
する
などのように任意の条件を設定し、代替アクションを行わせることができます。
空ではないテーブルTがあり、以下のように入力行データ S を処理するとします。
- FOR each input row in S DO
- IF EXISTING THEN // もし、行Sと同一の主キーの行が既にテーブルTに存在する場合
- IF condition-1 THEN SKIP // 条件 1 にマッチした場合は処理をスキップ
- ELSE IF condition-2 THEN ERROR //条件 2 にマッチした場合はエラーを返す
- ELSE IF condition-3 THEN DELETE FROM T //条件 3 にマッチした場合はその行をテーブル T から削除
- ELSE UPDATE T //条件 1 ~ 3 にマッチしなかったらその行を更新する
- ELSE // 行 S と同一の行がテーブル T に存在しなかった場合
- IF condition-4 THEN SKIP //条件 4 にマッチした場合は処理をスキップ
- ELSE IF condition-5 THEN ERROR //条件 5 にマッチした場合はエラーを返す
- ELSE INSERT INTO T //条件 4 ~ 5 にマッチしなかったら行 S を挿入する
- END
このロジック全体を、以下のような 1 つの MERGE
文として実行することが可能です。以下の例では、テーブル T にクライアントマシン上のテキストファイルを読み込み、それに含まれる行をマージしています。これは、version 11 の OPENSTRING
句を使用することでテーブルのように扱うことができます。
続きはこちら: SAP SQL Anywhere で MERGE 文を使用する
SAPのSAP SQL Anywhere製品ページはこちら